Перемещение круга по формуле y = mx + b в C ++ - PullRequest
0 голосов
/ 30 октября 2011

Итак, я пишу программу, которая перемещает окружность через линию, мне нужны координаты пикселов линии, поэтому я использую формулу 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);
 }  
}

Ответы [ 3 ]

1 голос
/ 30 октября 2011

Я предлагаю вам использовать параметрическое уравнение линии:

p1(x1, y1, z1) & p2(x2, y2, z2)

u shud know 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.
1 голос
/ 30 октября 2011
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;

При форсировании хотя бы одного параметрачтобы быть двойным в каждой операции, вы заставляете другую также быть удвоенной и заставляете операцию выполняться на двойниках.

Обратите внимание, что первая строка безопасна, только если yподписанный тип.Если нет, то (b.y-a.y) может потеряться.В этом случае вам нужно (b.y - (double) a.y).

0 голосов
/ 30 октября 2011

Поскольку вы не указали типы пары 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);
...