Рисование формы в обработке - PullRequest
1 голос
/ 18 июня 2020

Я работал над анимацией при обработке. Тогда у меня есть вопрос о l oop. Обычно мой код более длинный. Однако я сделал простой код, который может пригодиться и новичкам. Мой пример кода:

void setup(){
  println("Line between points " + curr + " and " + (curr+1));
  println("initial X: " + initialX + " initial Y: " + initialY );
  println("final   X: " + finalX + "   final Y: " + finalY );
  counter = 0; // reset counter;
}

void draw() {
  point(initialX, initialY);
  println(initialX, initialY, p);

  }

Итак, как вы видите, я использовал «Алгоритм Брезенхамса» для рисования линий. Однако когда я рисую линии, он не рисует линии между точками. Это просто немного рисует. Обычно мой текстовый файл такой длинный. Как нарисовать линии, которые могут следовать от первых координат x и y до последних координат x и y без разрыва соединения?

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Это реализация версии алгоритма Брезенхэма с использованием балансировки положительной и отрицательной ошибки между координатами x и y :

/*
String[] coordinates = {    // Creating an array for my text file.
"117 191",
"96 223",
"85 251",
"77 291",
"78 323",
"84 351",
"97 378",
"116 404",
"141 430"
};
*/
int[][] points;

int deltaX, deltaY;
int initialX, initialY;  // Initial point of first coodinate
int finalX, finalY;      // Final point of first coodinate
int counter = 0;
int curr = 0;
int sx, sy, err;

void setup() {

    size(500, 500);

    strokeWeight(4);
    frameRate(25);

    coordinates = loadStrings("coordinates.txt");
    beginShape();         // It combines the all of vertexes

    points = new int[coordinates.length][2];
    int row = 0;
    for (String line : coordinates) {
        String[] pair = line.split(" ");
        points[row] = new int[] { Integer.parseInt(pair[0]), Integer.parseInt(pair[1])};
        println(points[row][0]); // print x
        println(points[row][1]); // print y
        row++;
    }

    fixLines();

    endShape(CLOSE);
}

void fixLines() {
   int ix = curr % points.length;
   int jx = (curr + 1) % points.length;
   initialX = points[ix][0];
   initialY = points[ix][1];
   finalX = points[jx][0];
   finalY = points[jx][1];

   deltaX = abs(finalX - initialX);
   sx = initialX < finalX ? 1: -1;
   deltaY = -abs(finalY - initialY);
   sy = initialY < finalY ? 1: -1;
   err = deltaX + deltaY;

   println("Line between points " + curr + " and " + (curr+1));
   println("[" + initialX + ", " + initialY + "] - [" + finalX + ", " + finalY + "]");
   println("deltaX=" + deltaX);
}

void draw() {

    point(initialX, initialY);
    if (initialX == finalX && initialY == finalY) {
        curr++;
        if (curr == points.length) {
            noLoop();
        } else {
            fixLines();
        }
    } else {
        int e2 = 2 * err;
        if (e2 >= deltaY) {
            err += deltaY;
            initialX += sx;
        }
        if (e2 <= deltaX) {
            err += deltaX;
            initialY += sy;
        }
    }
}

Результат очень близок к линейной реализации: enter image description here

2 голосов
/ 19 июня 2020

Я пытаюсь обновить метод draw, чтобы обновить deltaY и продолжаю рисовать до deltaY != 0, но результат выглядит не очень хорошо. Скорее всего, вам необходимо пересмотреть свою реализацию алгоритма и связанные с ним вычисления.

void draw() 
{

  point(initialX, initialY);
  println(initialX, initialY, p);

  if (finalX > initialX )
    initialX++;
  else
    initialX--;

  if (p < 0) {
    p = p + 2 * deltaY;
  } else {
    if (initialY > finalY)
      initialY--;
    else
      initialY++;

    p = p + 2 * deltaY - 2 * deltaX;
  }
  deltaY = abs(finalY - initialY); // update deltaY

  counter++;
  if (counter > deltaX) {
    if (deltaY > 0) {
      counter--;
    } else {
      curr++;
      if (curr == points.length) {
        noLoop(); // possibly you should break out of the main loop here
      } else {
      fixLines();
      }
    }
  }
}

custom algorithm

Реализация с line(initialX, initialY, finalX, finalY); выглядит намного лучше.

void draw() 
{
  point(initialX, initialY);
  println(initialX, initialY, p);
  line(initialX, initialY, finalX, finalY);
  curr++;
  if (curr == points.length) {
    noLoop();
  } else {
    fixLines();
  }
}

drawing with line

...