Линия рисуется неправильно

поэтому я искал линейные алгоритмы, когда нашел алгоритм Брезенхэма. Я решил сделать его кодовую версию, и по большей части это сработало. Однако когда я захотел нарисовать квадрат, я столкнулся с проблемой. Он не будет рисовать определенную линию. Вот мой код (должен упомянуть, что я использую p5.js):

function drline(xs, ys, xe, ye) {
 if(xs == xe && ys == ye){
   point(xs, ys);
 } else {
   var df = (ye - ys) / (xe - xs);
   var lf = 0;
   var tf = 0;
   var is = 0;
   for(var i = xs; i <= xe; i++){
     tf = i - xs;
     lf = df * tf;
     is = lf+ys;
     console.log("X: " + i + ", Y: " + is);
     point(i, is);
   }
 }
}

function init(){
  createCanvas(700, 600);
  background(80);
  stroke(100, 200, 255);

}

function setup(){
 init();
 drline(300, 100, 400, 100);
 drline(300,200, 400, 200);
 drline(300, 100, 300, 200);
}

Я также заметил, что последнее значение, которое было на консоли, было X: 300, Y: NaN. Извините, если это звучит как нуби, но я не уверен, в чем проблема. Заранее спасибо! :)


person Arturo Contreras    schedule 15.06.2018    source источник


Ответы (1)


У вас ошибка "Делить на ноль".

В вашей последней строке:

 drline(300, 100, 300, 200);
        ^xs       ^xe

Я предполагаю, что xs = xStart и xe = xEnd

в этой строке вы пытаетесь вычислить угол... но если xs и xe равны, вы получите 0 (ноль) знаменатель.

 var df = (ye - ys) / (xe - xs);

Таким образом, вы получите NaN, так как это невозможно вычислить.

Вам нужно будет добавить в свою логику специальное условие, которое if((xe - xs) == 0){...} (например, вертикальный подъем без пробега или «неопределенный» наклон) и обработать его соответствующим образом.

person scunliffe    schedule 15.06.2018