我有八个八分圆实现中点算法的问题。当y轴反转时,当前情况如下图所示。
到目前为止,我设法让第1区工作完美,我不知道如何让它适用于其他区域,我一直在google,而我发现的只是第1区的例子而不是在其他区域。
这里是我的区域1的代码
imp lf/lf@xe file=scott.dmp log=imp.log full=y
}
默认情况下,给定的决策参数为void Line2D::MPOct1(const Window& window, const Point2D& start,
const Point2D& end, const float& delta_x, const float& delta_y) const
{
Color color = mStartVtx.GetColor();
int int_delta_x = static_cast<int>(round(delta_x));
int int_delta_y = static_cast<int>(round(delta_y));
int start_x = static_cast<int>(round(start.GetX()));
int start_y = static_cast<int>(round(start.GetY()));
int const end_x = static_cast<int>(round(end.GetX()));
int f = 2 * int_delta_y - int_delta_x;
int f_e = 2 * int_delta_y ;
// should be se due to y axis inverted
int f_ne = 2 * int_delta_y + 2 * int_delta_x;
while (start_x <= end_x )
{
if (f >= 0)
{
window.SetPixel(start_x, start_y, color);
f += f_e;
start_x ++;
}
else
{
window.SetPixel(start_x, start_y, color);
f += f_ne;
start_x ++;
// y axis inveted so --
start_y --;
}
}
,我假设的8方向为:
2deltaY -deltaX
任何人都可以告诉我如何解决其他oct区域,通过操纵
更新我设法使区域1,4,5和8工作
答案 0 :(得分:0)
1)通过特殊功能处理垂直和水平线
2)制作两个函数 - 第一个八分圆的F1(其中x变化更快)和第二个八分圆的F2(其中y变化更快)
3)获得类似DeltaX = Abs(X2 - X1)
的绝对delta值
4)获得类似XStep = (X2 - X1>0)?1:-1
的步骤方向
5)对于1,4,5,8个八分圆,使用具有增量和步长的函数F1(而不是start_x ++
使start_x += XStep
等)
6)对于2,3,6,7个八分圆,使用函数F2,使用增量和步骤