Рисование изображения по склону в OpenGL - PullRequest
0 голосов
/ 25 августа 2018

Я пишу программу, которая может нарисовать линию между двумя точками с закрашенными кружками. Круги: - не должны перекрывать друг друга - быть как можно ближе друг к другу - и центр каждого круга должен быть на линии.

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

void addCircles(scrPt endPt1, scrPt endPt2)
{
  float xLength, yLength, length, cSquare, slope;
  int numberOfCircles;

  // Get the x distance between the two points
  xLength = abs(endPt1.x - endPt2.x);

  // Get the y distance between the two points
  yLength = abs(endPt1.y - endPt2.y);

  // Get the length between the points
  cSquare = pow(xLength, 2) + pow(yLength, 2);
  length = sqrt(cSquare);

  // calculate the slope
  slope = (endPt2.y - endPt1.y) / (endPt2.x - endPt1.x);

  // Find how many circles fit inside the length
  numberOfCircles = round(length / (radius * 2) - 1);

  // set the position of each circle
  for (int i = 0; i < numberOfCircles; i++)
  {
     scrPt circPt;
     circPt.x = endPt1.x + ((radius * 2) * i);
     circPt.y = endPt1.y + (((radius * 2) * i) * slope);

     changeColor();
     drawCircle (circPt.x, circPt.y);
  }

Вот что выдает приведенный выше код:

img

Я совершенно уверен, что проблема заключается в этой строке, которая задает значение у круга:

circPt.y = endPt1.y + (((radius * 2) * i) * slope);

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 25 августа 2018

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

float xDist = endPt2.x - endPt1.x;
float yDist = endPt2.y - endPt1.y;

float length = sqrt(xDist*xDist + yDist *yDist);
float xDir   = xDist / length;
float yDir   = yDist / length;

Рассчитать расстояние от одной центральной точки до следующей, numberOfSegments - это количество сечений, а не количество кругов:

int numberOfSegments = (int)trunc( length / (radius * 2) );
float distCpt = numberOfSegments == 0 ? 0.0f : length / (float)numberOfSegments;

Центральная точка окружности рассчитывается путем добавления вектора к начальной точке линии. Пинты вектора в направлении линии и ее длины задаются расстоянием между двумя кружками, умноженным на «индекс» окружности:

for (int i = 0; i <= numberOfSegments; i++)
{
   float cpt_x = endPt1.x + xDir * distCpt * (float)i;
   float cpt_y = endPt1.y + yDir * distCpt * (float)i;     

   changeColor();
   drawCircle(cpt_x , cpt_y);
}   

Обратите внимание, что последний круг в строке может быть перерисован первым кругом следующей строки. Вы можете изменить это, изменив итерационное выражение цикла for - замените <= на <:

for (int i = 0; i < numberOfSegments; i++)

В этом случае в конце линии вообще не будет нарисован ни один кружок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...