在屏幕上计算坐标

时间:2011-11-10 12:23:39

标签: coordinates

我知道关于这个主题还有很多其他问题,我想我已经阅读了大部分内容,以及维基百科和其他一些文章,但我想(我认为)一些简单的算法来完成我的坐标计算

我有这个代码:

typedef struct {
    double startX;
    double startY;
    double x2;
    double y2;
    double length;
    double angle;
    double lastAngle;
} LINE;
void lineCalc(LINE *lp) {
    double radians = lp->angle * 3.141592653589793/180.0;
    lp->x2 = lp->startX + (lp->length * cos(radians));
    lp->y2 = lp->startY +  (lp->length * sin(radians));
    fprintf (stderr, "lineCalc:startX:%2.3f, startY:%2.3f, length:%2.3g, angle:%2.3f, cos(%2.3f):%2.3f, x2:%2.3f, y2:%2.3f\n", lp->startX, lp->startY, lp->length, lp->angle, lp->angle, cos(radians), lp->x2, lp->y2);
}
int main() {
    // Initialise to origin of 250, 250. 0, 0 for initial end point. Length 150, first angle 60 (degrees), l.lastAngle currently not used
    LINE l = {250, 250, 0, 0, 150, 60, 0};
    lineCalc(&l);
    //drawLine(&l);
    l.startX = x2; l.startY = y2; // make last end point, new start point. Angle stays at 60 degrees
    lineCalc(&l);
    //drawLine(&l);
    l.startX = x2; l.startY = y2;
    lineCalc(&l);
    //drawLine(&l);
}
它根据起点,长度和角度计算线的终点。一切都很好,但我想要做的是绘制一个形状,一个三角形将是一个开始。

目前代码将进行计算,绘制线(实际上它是生成SVG),将最后一个终点作为下一个原点,重新计算,绘制下一行等...

我缺少的关键点是如何使角度相对于绘制的最后一条线。此时,原点的移动工作正常,但角度保持不变,因此三条角度为60度的线条将绘制一条直线,因为角度相对于起点而不是相对于最后一条线。 / p>

以防万一相关,SVG水平为零度。因此,一条50个单位长的线,从y100开始,x100角度为90度,终点为y150,x100。

有人可以指出一个显而易见的事情,我错过了相对于最后一行的角度是否正确?

1 个答案:

答案 0 :(得分:1)

如果您将第一行的绘制角度设为theta:

theta + 180度OR theta - 180度将面向您回到刚刚画出的线上。

然后θ+ 180度+ 60或θ-180度+ 60将面向您与第一行成60度。

你需要根据svg使用的度数范围(它是-180到180还是0到360)以及你的起始θ的大小来选择是否+或 - 180。您还需要根据要绘制第二行的第一行的一侧选择+或 - 60度。

一旦你计算了第二条线的角度(例如,theta + 180 + 60),那么你需要将它作为下一个θ来计算第三条线的角度。