2014-09-23 59 views
0

我需要編寫一個函數,該函數將採用半徑爲r的函數,並嚴格返回以原點爲中心的半徑爲r的圓內的整數個離散點。任何提示將不勝感激。MATLAB:返回圖形下離散點的數目

+0

到目前爲止你做了什麼?請告訴我們。一個代表性的形象也會很好:) – 2014-09-23 18:50:41

+0

我目前沒有太多的代碼。但我的想法是,我將有一個從-R到R的整數範圍,代表每個x和y,然後需要計算滿足x^2 + y^2 user2049004 2014-09-23 19:00:52

+0

@ user2049004 - 你有正確的想法。你只需要找出正確的功能來生成你的座標:)看我的帖子。 – rayryeng 2014-09-23 19:02:41

回答

0

只是作爲一種方法:

  • 定義,將適合的離散點的方陣
  • 定義一個函數/條件如果矩陣點。將(嚴格)的圓內
  • 計數真值的數量

祝您好運,如果您在某處遇到問題,請隨時修改帖子。

+1

當我把這個放在lol中時,我確實是在輸入我的解決方案。無論如何,我決定解決它,因爲這對我來說是一個很好的心理鍛鍊。反正好吧! – rayryeng 2014-09-23 19:02:13

+0

如果我在家裏有matlab,我也會這樣做;) – Pieter21 2014-09-23 19:03:09

1

即使您沒有向我們展示任何解決您的代碼的嘗試,但這是一個不錯的練習,我不介意解決這個問題。你可以首先做的是產生一個以原點爲中心的方形網格座標系,它位於-r+r之間。請記住,如果我正確地解釋您的問題,則2D網格中每個點之間的間距爲1。

一旦你這樣做,你可以找到那些歐氏距離嚴格小於r的位置,然後返回滿足這個條件的點數。要生成點的正方形網格,請使用meshgrid。假設你已經在r定義你的半徑,你會做以下代碼:

[x,y] = meshgrid(-r:r, -r:r); 
x = x(:); 
y = y(:); 
num_points = sum(x.^2 + y.^2 < r^2); 

x = x(:);y = y(:);是很重要的。這將每個xy的2D網格變成單列向量。具體來說,它需要矩陣的每一列,並將它們從上到下堆疊起來形成一個單獨的向量。它使分析更容易。原因是因爲如果我們試圖在2D矩陣上使用sum,它只能在一個方向上求和。您可以單獨彙總所有列,也可以單獨彙總所有行。既然你想總結整個數組,你可以調用sum兩次,或者將你的2D網格轉換成一堆一維數組。我選擇了第二種方法,因爲我覺得它更乾淨,但有些人並不介意將電話號碼連在一起......這只是一種風格偏好。

一旦你這樣做,我們只需檢查歐幾里德距離是否小於半徑。請注意,我正在計算歐幾里德平方距離以避免計算平方根。它會節省計算時間。然後我們總結所有實例,這將定義在半徑內有多少個點。

作爲一個例子,假設我們的半徑是r = 2。這是我們點的meshgrid會是什麼樣子:

r = 2; 
[x,y] = meshgrid(-r:r, -r:r) 

x = 

    -2 -1  0  1  2 
    -2 -1  0  1  2 
    -2 -1  0  1  2 
    -2 -1  0  1  2 
    -2 -1  0  1  2 

y = 

    -2 -2 -2 -2 -2 
    -1 -1 -1 -1 -1 
    0  0  0  0  0 
    1  1  1  1  1 
    2  2  2  2  2 

對於我們的2D網格每個座標,我們在每一個點相關聯的(x,y)對。我們得到點的最終數目爲:

num_points = 

9 

這有意義的,因爲是嚴格小於2只應在3×3塊以原點爲中心的點。如果你想確保,我們可視化的網格的樣子,你轉換座標爲一維向量之前:

[x,y] = meshgrid(-r:r, -r:r); 
disp(x.^2 + y.^2 < r^2); 

0  0  0  0  0 
0  1  1  1  0 
0  1  1  1  0 
0  1  1  1  0 
0  0  0  0  0 

位置是1表示true,這意味着該統籌滿足它嚴格地小於r0的位置表示false,這表示它們在外面。算法的最後一部分是對所有這個數組進行求和,這給了我們9個,這就是嚴格在r之內的點數。


希望這會有所幫助。祝你好運!