确定阴阳点

时间:2016-11-09 21:20:51

标签: c++ visual-c++ console

我必须发明一种算法,当我们在控制台中输入两个坐标(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";
    }

2 个答案:

答案 0 :(得分: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';
    }
}

输出:

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

答案 1 :(得分: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

基本上你必须计算关于圆圈中是否有点的标志,然后是象限(左或右)并组合标志。这幅图有很多帮助:)