gpt4 book ai didi

c++ - 找到扇区内部的点

转载 作者:行者123 更新时间:2023-11-28 08:01:15 25 4
gpt4 key购买 nike

已解决:参见 my answer .

我试图找到一个位于圆弧内部的点,这样当发生填充时,它不会意外地填充圆弧外的区域。只要两个角之间的距离的绝对值:开始和结束;小于 PI 这有效(有几个极端的边缘情况,其中绘制的线非常接近以至于选择的点是这些线的一部分,但那是另一天......)。

我遇到的问题是,当开始角和结束角之间的距离的绝对值大于 PI 时,泛洪发生在弧的外部而不是内部。许多例子是:如果圆弧从 0 开始到 3PI/2 结束,距离的绝对值为 3PI/2,在角度之间发生泛洪,就好像绝对值距离是 PI/2 并泛滥整个屏幕除了吃 bean 人形弧。

编辑:

为避免混淆,这里是根据快板(和一般三角函数)定义的圆弧:

void arc(BITMAP *bmp, int x, y, fixed ang1, ang2, int r, int color);

Draws a circular arc [minus the initial/terminal sides or center point] with centre [sic] x, y and radius r, in an anticlockwise [sic] direction starting from the angle a1 and ending when it reaches a2....Zero is to the right of the centre [sic] point, and larger values rotate anticlockwise [sic] from there.

方括号是我的符号。

我已经负责将 allegro 的(愚蠢的)固定整数 使用转换为正确的弧度 值。

结束编辑

void Arc::Draw(BITMAP* dest, int color, bool filled, bool showCenter, bool showSides) {

if(showSides || filled) {
Line initial(GetX(), GetY(), GetZ(), GetStartPoint().GetX(), GetStartPoint().GetY(), GetZ(), false);
initial.SetColor(color);

Line terminal(GetX(), GetY(), GetZ(), GetEndPoint().GetX(), GetEndPoint().GetY(), GetZ(), false);
terminal.SetColor(color);

initial.Draw(dest, initial.GetColor(), false);
terminal.Draw(dest, terminal.GetColor(), false);

} else if(showCenter) {
putpixel(dest, GetX(), GetY(), color);
}

//Draw arc first to prevent flood overflow.
arc(dest, GetX(), GetY(), AngleConverter::RadianToFixed(_startAngle), AngleConverter::RadianToFixed(_endAngle), _radius, color);

if(filled) {

double distance = std::fabs(this->_endAngle - this->_startAngle);
if(distance < a2de::A2DE_PI) {

Line displace(GetStartPoint(), GetEndPoint(), false);
Point displacePoint(displace.GetCenter());
floodfill(dest, displacePoint.GetX(), displacePoint.GetY(), color);

} else if(distance > a2de::A2DE_PI) {

Line displace(GetStartPoint(), GetEndPoint(), false);
Vector2D center_of_displacement(displace.GetCenter());
Vector2D center_point(this->_center);
Vector2D direction_of_center(center_of_displacement - center_point);

double angle = std::atan2(direction_of_center.GetY(), direction_of_center.GetX());
Vector2D flood_point = center_point - direction_of_center;
flood_point += angle;

double x = flood_point.GetX() > 0.0 ? std::ceilf(flood_point.GetX()) : std::floorf(flood_point.GetX());
double y = flood_point.GetY() > 0.0 ? std::ceilf(flood_point.GetY()) : std::floorf(flood_point.GetY());
floodfill(dest, x, y, color);

} else {

if(_startAngle == 0.0 || _endAngle == a2de::A2DE_2PI) {
floodfill(dest, GetX(), GetY() - 1, color);
} else if(_endAngle == 0.0 || _startAngle == a2de::A2DE_PI) {
floodfill(dest, GetX(), GetY() + 1, color);
}

}

}
}

最佳答案

首先,关于您的“原文”评论。圆心点通常也称为弧的圆心,逆时针是最常见的约定。正如 x 轴指向右侧,y 轴指向上方,角度从正 x 轴开始。

要确定点 x,y 是否在极坐标 (r,eta) 定义的区域内,您只需将点 x_point,y_point 转换为极坐标

r_point=sqrt((x_point-x_circle)^2 + (y_point-y_circle)^2 )
eta_point=atan2((y_point-y_circle) , (y_point-x_circle))

使用atan2,那么你就不需要考虑符号和pi-flips等what is the difference between atan and atan2 in c++?

Now, is the radious within the 'sector' ?
if (r_point<r_sector) ...

如果是这种情况,值得看一下角度部分:从 eta_point 和扇区的角大小中减去星角

eta_point_new = eta_point - ang1
ang2_new = ang2 - ang1

现在,ang2_new 是扇区在旋转方向上的大小,而 eta_point_new 是该点的距离。如果 ang2_new 为负数,则表示该扇区越过角坐标的边界,因此您需要向其添加 2pi。然后:

if (eta_point_new < ang2_new) 
... then the point is inside...

很抱歉,我没有时间测试它或用适当的 C++ 编写它,随心所欲。

关于c++ - 找到扇区内部的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11416565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com