所以我正在编写一个通过直线移动圆圈的程序,我需要行像素的坐标,所以我使用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);
}
}
答案 0 :(得分:1)
double m = (b.y-a.y)/(b.x-a.x);
double b1 = a.y - m * x;
double y = m * x + b1;
C ++不会使用您对值的操作来影响值的计算方式。您将这些值分配给双精度这一事实并不会导致它们被计算为双精度数。由于数学是整数,你得到整数数学,绝对不是你想要的。
一个修复:
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,并强制对双精度执行操作。
请注意,如果y
是签名类型,则第一行才是安全的。如果没有,(b.y-a.y)
可能会下溢。在这种情况下,您需要(b.y - (double) a.y)
。
答案 1 :(得分:1)
我建议你使用线的参数方程:
p1(x1, y1, z1) & p2(x2, y2, z2)
你不知道p1& P2。
现在对于任何点p(x,y,z),使用参数't'。
t = p2 - p1;//this gives you 't'
p = p1 + t *(p2 -p1)//you know p1, p2, t...so get values of p.
答案 2 :(得分:0)
由于您没有指定对x
和y
的类型,我的猜测是该行
double m = (b.y-a.y)/(b.x-a.x);
造成了这个问题。如果这两个值为int
,并且第一个值较低,则它将始终返回0
。要使m成为实际值,您需要显式转换为bool:
double m = (double)(b.y-a.y)/(b.x-a.x);