[英]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.