(x - x0)^2/a^2 + (y - y0)^2/b^2 == 1
其中(x0,y0)是椭圆的中心。
中心点(x0,y0)随机位于区域[SIZE/4, 3*SIZE/4]x[SIZE/4, 3*SIZE/4]
中,
和{,{1}}区间中的a,b,以便在大多数情况下完整的曲线可以位于图中。
我必须使用给定的信息在大小为15(0到14)的X-Y轴上打印出一个椭圆。
我正在使用[SIZE/4, SIZE/2]
打印'。'在整个图形上,并且只能使用'E'在给定的图形的那部分上打印给定尺寸的椭圆。
我必须使用方程式来测试哪些点在曲线的内部或外部。
我必须找到最接近曲线的点。 例如,我可以从中心(x0,y0)开始,然后继续向上移动直到 我找到一个点(x0,y1),例如:
cout
(x0 - x0)^2/a^2 + (y1 - y0)^2/b^2 >= 1
然后(x0,y1-1)和(x0,y1)是候选点,它们是最接近x = x0线上曲线的点。
答案 0 :(得分:2)
首先创建一个用于保存Point的类:
struct Point
{
const int x;
const int y;
};
接下来,创建一个类来保存椭圆参数并检查该椭圆上(或其内部)是否有点:
struct Ellipse
{
const Point center;
const int a;
const int b;
bool is_on_ellipse(Point p) const
{
return std::pow(p.x - center.x, 2) / std::pow(a, 2) + std::pow(p.y - center.y, 2) / std::pow(b, 2) == 1.0;
}
bool is_inside_ellipse(Point p) const
{
return std::pow(p.x - center.x, 2) / std::pow(a, 2) + std::pow(p.y - center.y, 2) / std::pow(b, 2) < 1.0;
}
};
然后您可以创建一个椭圆,如下所示:
Ellipse e = {{0, 0}, 2, 3};
然后通过调用e.is_on_ellipse({px, py})
使用C ++ 20,它可能会更加冗长(但更容易验证正确性):
Ellipse e = {.center = {.x = 0, .y = 0}, .a = 2, .b = 3};
//....
e.is_on_ellipse({.x = px, .y = py})
答案 1 :(得分:2)
不会为您提供完整的解决方案,但是我认为我看到了您遇到的一般问题。我的评论只是集思广益。这就是我实际要采用的方式:
在使用cout
打印.
时,应使用
std::array<std::string,N_ROWS> grid;
使用正确大小的string
s正确初始化它,并使用函数std::pair<double,double> get_coordinates(int x,int y)
在离散坐标和“世界坐标”之间转换。
要知道网格点是否为省略号的一部分,您必须意识到对于离散网格,方程式
(x - x0)^2/a^2 + (y - y0)^2/b^2 == 1
对于某些网格坐标x_i,y_i
,永远不会完全满足。但是,这种不平等:
(x - x0)^2/a^2 + (y - y0)^2/b^2 < 1
告诉您点(x,y)
是否位于省略号区域内。如果您考虑四个相邻点:
x_i,y_i
x_i+1,y_i
x_i,y_i+1
x_i+1,y_i+1
然后升空
grid[x_i][y_i]
在省略号之内grid[x_i][y_i]
不在省略号之内grid[x_i][y_i]
是省略号的一部分,即它得到了.
(在最后一步中,我使用了grid[x_i][y_i]
,而应该是grid[x_i + 1/2][y_i + 1/2]
,但这只是将整个网格移动了半个像素,应该没有太大关系)
PS:在此期间,问题已被编辑。不清楚是什么是需求的一部分,什么是您的解决方案的一部分,所以我不知道这个答案是否有帮助。我就把它留在这里...