我知道关于这个主题还有很多其他问题,我想我已经阅读了大部分内容,以及维基百科和其他一些文章,但我想(我认为)一些简单的算法来完成我的坐标计算
我有这个代码:
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。
有人可以指出一个显而易见的事情,我错过了相对于最后一行的角度是否正确?
答案 0 :(得分:1)
如果您将第一行的绘制角度设为theta:
theta + 180度OR theta - 180度将面向您回到刚刚画出的线上。
然后θ+ 180度+ 60或θ-180度+ 60将面向您与第一行成60度。
你需要根据svg使用的度数范围(它是-180到180还是0到360)以及你的起始θ的大小来选择是否+或 - 180。您还需要根据要绘制第二行的第一行的一侧选择+或 - 60度。
一旦你计算了第二条线的角度(例如,theta + 180 + 60),那么你需要将它作为下一个θ来计算第三条线的角度。