如何使用椭圆方程绘制椭圆?

时间:2020-03-28 10:35:05

标签: c++

(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线上曲线的点。

2 个答案:

答案 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:在此期间,问题已被编辑。不清楚是什么是需求的一部分,什么是您的解决方案的一部分,所以我不知道这个答案是否有帮助。我就把它留在这里...

相关问题