2016-11-09 84 views
0

我必須發明一種算法,當我們在控制檯中輸入兩個座標(x,y)時,如果具有該座標的點位於圖像的黑色部分,則結果爲白色或在邊界。如果你能幫助我會很好。確定陰陽上的一個點

enter image description here

我開始用最小的圓圈和這樣做,但我不知道如何繼續。

 double x; 
    double y; 

    const int smallCircleRadius = 1; 
    const int mediumCircleRadius = 3; 
    const int bigCircleRadius = 6; 

    cin >> x >> y; 

    double d1 = sqrt(pow(abs(x - 0),2) + pow(abs(y - 3),2)); 
    double d2 = sqrt(pow(abs(x - 0),2) + pow(abs(y + 3),2)); 
    if(d1 < smallCircleRadius) 
    { 
     cout<<"Evil"; 
    } 
    else if(d2 < smallCircleRadius) 
    { 
     cout<<"Good"; 
    } 
    if(d1 == smallCircleRadius || d2 == smallCircleRadius) 
    { 
     cout<<"Neutral"; 
    } 

回答

1

我覺得我得到的邏輯想通了,在Python,所以你必須將它移植,但你會得到的想法:

smallCircleRadius = 1 
mediumCircleRadius = 3 
bigCircleRadius = 6 

def yytest(x,y): 
    print(x,y,) 

    in_big_circle = ((x**2)+(y**2)) < bigCircleRadius**2 

    in_small_circle_upper_y = x**2+(y-mediumCircleRadius)**2 < smallCircleRadius**2 
    in_small_circle_lower_y = x**2+(y+mediumCircleRadius)**2 < smallCircleRadius**2 

    in_medium_circle_upper_y = x**2+(y-mediumCircleRadius)**2 < mediumCircleRadius**2 
    in_medium_circle_lower_y = x**2+(y+mediumCircleRadius)**2 < mediumCircleRadius**2 

    in_left_quadrant = x < 0 

    if in_big_circle: 
     if in_left_quadrant: 
      if (not in_medium_circle_lower_y or in_small_circle_lower_y) and not in_small_circle_upper_y: 
       return("good") 
      else: 
       return("evil") 
     else: 
      # right quadrant 
      if (not in_medium_circle_upper_y or in_small_circle_upper_y) and not in_small_circle_lower_y: 
       return("evil") 
      else: 
       return("good") 

    else: 
     return("neutral") 

print(yytest(1,1))  # good 
print(yytest(10,10)) # neutral 
print(yytest(-0.5,3)) # evil 
print(yytest(2,-2)) # evil 

基本上你必須計算有關的標誌指向或不在圓圈中,然後是象限(左或右)併合並標誌。在這裏繪圖有很多幫助:)

+0

謝謝!例如,我得到了邏輯 部分但符號'**'和'<'在這裏'in_small_circle_upper_y = x ** 2 +(y-mediumCircleRadius)** 2

+0

'** 2'是方形的。我不使用平方根,我比較平方距離。 –

2

下面是你將如何在C++中做到這一點。也就是說,如果你的任務要求傾銷ASCII藝術而不是這個「好」和「邪惡」的東西。但將GetYyZone適應您的需求將是微不足道的。

#include <iostream> 
#include <cmath> 

// GetYyZone returns the color corresponding to a point: 
// +1 for one color, -1 for its opposite and 0 for points outside the figure 
int GetYyZone(double x, double y, double radius=6) { 
    // Calculate sub-radii 
    const double med_radius = radius/2;  // always half the major radius 
    const double sm_radius = med_radius/3; // anything smaller than the medium radius 

    // check for points outside the main disk, returing 0 if so. 
    if(x*x + y*y > radius*radius) return 0; 

    // d_xl_sq is the squared distance from the point to its sub-center 
    const double d_xl_sq = x*x + y*y - std::fabs(y)*med_radius*2 + med_radius*med_radius; 
    if(d_xl_sq < sm_radius*sm_radius) return y > 0 ? -1 : 1; 
    if(d_xl_sq < med_radius*med_radius) return y > 0 ? 1 : -1; 
    return x > 0 ? -1 : 1; 
} 

int main() { 
    // This calls GetYyZone to select characters for ASCII art 
    const int cols = 75; 
    const int rows = 36; 
    for(int j=0; j<rows; ++j) { 
     for(int i=0; i<cols; ++i) { 
      const double x = (2.0/(cols - 1) * i - 1) * 6.5; 
      const double y = (2.0/(rows - 1) * j - 1) * -6.5; 
      const int zone = GetYyZone(x, y); 
      std::cout << (zone == 0 ? '+' : zone == -1 ? '#' : ' '); 
     } 
     std::cout << '\n'; 
    } 
} 

輸出:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++++++++++++++++++++++    ###++++++++++++++++++++++++++++ 
++++++++++++++++++++++       #####++++++++++++++++++++++ 
+++++++++++++++++++        ######+++++++++++++++++++ 
++++++++++++++++         #######++++++++++++++++ 
++++++++++++++          ########++++++++++++++ 
++++++++++++      #####    #########++++++++++++ 
++++++++++      #########   ###########++++++++++ 
++++++++      ###########   ############++++++++ 
+++++++       ###########   #############+++++++ 
++++++       #########   ###############++++++ 
+++++        ###    ################+++++ 
+++++            #################+++++ 
++++            ###################++++ 
++++            #####################++++ 
+++           #########################+++ 
+++          #############################+++ 
+++        ########################################+++ 
+++       ############################################+++ 
++++      ##############################################++++ 
++++     ################################################++++ 
+++++     ################################################+++++ 
+++++    ############### ###############################+++++ 
++++++    ############   ###########################++++++ 
+++++++    ############   #########################+++++++ 
++++++++   ############   ########################++++++++ 
++++++++++   ############   #######################++++++++++ 
++++++++++++   ##############  #######################++++++++++++ 
++++++++++++++  #######################################++++++++++++++ 
++++++++++++++++  ####################################++++++++++++++++ 
+++++++++++++++++++  ###############################+++++++++++++++++++ 
++++++++++++++++++++++  ##########################++++++++++++++++++++++ 
++++++++++++++++++++++++++++ ################++++++++++++++++++++++++++++ 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++