我必须发明一种算法,当我们在控制台中输入两个坐标(x,y)时,如果具有该坐标的点位于图片的黑色部分中,则为白色或边界。如果你能帮助我会很棒。
我从最小的圈子开始,然后这样做,但我不知道如何继续。
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";
}
答案 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
基本上你必须计算关于圆圈中是否有点的标志,然后是象限(左或右)并组合标志。这幅图有很多帮助:)