簡體   English   中英

如何使用橢圓方程繪制橢圓?

[英]How to draw an ellipse using the ellipse equation?

(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] ,a, b 位於[SIZE/4, SIZE/2]以便在大多數情況下完整的曲線可以位於圖中。

我必須使用給定的信息在尺寸為 15(0 到 14)的 XY 軸上打印一個橢圓。

我正在使用cout打印 '.' 在整個圖形上,並且必須使用給定的尺寸僅在使用“E”的圖形部分上打印橢圓。

我必須使用方程來測試哪些點在曲線內部或外部。

我必須找到最接近曲線的點。 例如,我可以從中心(x0,y0)開始,一直向上移動,直到找到一個點(x0,y1),例如:

  • (x0 - x0)^2/a^2 + (y1 - y0)^2/b^2 >= 1
  • (x0 - x0)^2/a^2 + ((y1 - 1)- y0)^2/b^2 <= 1

然后 (x0, y1 - 1) 和 (x0, y1) 是最接近 x = x0 線上曲線的點的候選。

首先創建一個類來保存一個點:

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})

不會給你一個完整的解決方案,但我想我看到了你遇到的一般問題。 我的評論只是一些頭腦風暴。 這就是我實際處理它的方式:

當您使用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:在此期間,問題已被編輯。 目前尚不清楚什么是要求的一部分以及您的解決方案的一部分,所以我不知道這個答案是否有任何幫助。 我就留在這里吧……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM