因此,我正在编写一个程序,该程序在一条直线上移动圆,我需要线像素的坐标,所以我使用的是y = mx + b
公式,但是如果我使用y
,则x++
的坐标不会改变,可以有人告诉我我做错了吗?
这是我使用此公式的代码的一部分:
void draw_picture(Canvas & canvas) {
srand((unsigned)time(0));
PairXY a(200,400);
PairXY b(300,100);
int o=20;
Line l(a,b);
double x=0;
Circle cir(a,o);
draw_circle(cir, canvas);
draw_line(l, canvas);
x=a.x;
for (int i=20; i>0; i--){
x++;
///////
double m = (b.y-a.y)/(b.x-a.x);
double b1 = a.y - m * x;
double y = m * x + b1;
///////
a.x=x;
a.y=y;
Circle cir1(a,o);
draw_circle(cir1, canvas);
}
}
最佳答案
double m = (b.y-a.y)/(b.x-a.x);
double b1 = a.y - m * x;
double y = m * x + b1;
C ++不会使用对值的处理来影响值的计算方式。您将这些值分配给double的事实并不会使它们被计算为double。由于数学是整数,因此您将获得整数数学,这绝对不是您想要的。
一种解决方法:
double m = (b.y-a.y) / (double) (b.x-a.x);
double b1 = a.y - (double) m * x;
double y = m * (double) x + b1;
通过在每个操作中强制至少一个参数为double,可以将另一个参数也强制提升为double,并在double上强制执行该操作。
请注意,只有
y
是带符号类型,第一行才是安全的。如果没有,(b.y-a.y)
可能会下溢。在这种情况下,您需要(b.y - (double) a.y)
。