Реализация алгоритма рисования линий не работает должным образом

Первый вопрос, я попытался вычислить выражение, di+1=di+2*Δy−2*Δx(yi+1−yi) для четырех квадрантов. Независимо от квадранта было установлено, что выражение было одинаковым, включая знаки.
Я прав, или в моих вычислениях были какие-то ошибки (следовательно, я ошибаюсь)?

Второй вопрос: если это выражение применимо только к первому октету, как я могу применить это к другим октетам? Для меня нет способа определить, над каким октетом я работаю. Ведь значение m всегда представляет два противоположных октета. Например, если 0<m<1, он представляет 1-й и 5-й октет. Правильно?

В-третьих, как мы можем определить начальное / начальное значение di?

#include <iostream>
#include "utils.h"
void BresenhamLine(double x1, double y1, double x2, double y2, int color)
{
if(x1>x2 || y1>y2)
{
Swap(x1, x2);
Swap(y1, y2);
}
double x = x1;
double y = y1;
double dx = x2 - x1;
double dy = y2 - y1;
double dt = 2 * (dy - dx);
double ds = 2 * dy;
double d = 2*dy - dx;

PlotPixel(x, y, color);

if(dx>=dy)
{
while(x<=x2)
{
x++;
if(d<0)
{
d = d + ds;
}
else
{
y++;
d = d + dt;
}
PlotPixel(x, y, color);
}
}
else
{
while(y<=y2)
{
y++;
if(d<0)
{
x++;
d = d + dt;
}
else
{
d = d + ds;
}
PlotPixel(x, y, color);
}
}
}

int main()
{
int gm = DETECT;
int gd = DETECT;

initgraph(&gm, &gd, "");

double x1 = 0;
double y1 = 0;
double r = 50;
double x2 = 0;
double y2 = 0;
double signx = 0;
double signy = 0;

for(int theta=0 ; theta<=360 ; theta++)
{
x2 = r * cos(DegreeToRad((double) theta));
y2 = r * sin(DegreeToRad((double) theta));

x1 = 5 * cos(DegreeToRad((double) theta));
y1 = 5 * sin(DegreeToRad((double) theta));

BresenhamLine(x1, y1, x2, y2, YELLOW);
}

getch();
closegraph();
return 0;
}

Линии, проходящие через 2-й и 4-й квадрант, не отображаются.

Как это исправить с небольшими изменениями в моем коде?

-3

Решение

С этим входом: x1: 100 y1: -100 x2: -100 y2: 100

эта логика:

if(x1>x2 || y1>y2)
{
Swap(x1, x2);
Swap(y1, y2);
}

выходит из строя.

4

Другие решения

Эта страница — хорошее место для начала. Также показан код для одного из октантов:

http://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html

Я думаю, вам нужно поменять местами x если x1 > x2 и поменять местами y если y1 > y2 но не своп и то и другое если только 1 из них является правдой.

внешняя ссылка раздел Страница википедии содержит несколько ссылок на готовые реализации, которые вы можете изучить.

1

Попробуй это:

void BresenhamLine( double x1, double y1, double x2, double y2, int color )
{
const bool steep = (std::abs(y2 - y1) > std::abs(x2 - x1));
if(steep)
{
std::swap(x1, y1);
std::swap(x2, y2);
}

if(x1 > x2)
{
std::swap(x1, x2);
std::swap(y1, y2);
}

double dx = x2 - x1;
double dy = std::abs(y2 - y1);

double error = dx / 2;
int ystep = (y1 < y2) ? 1 : -1;
int y = (int)y1;

int maxX = (int)x2;

for(int x=(int)x1; x<maxX; x++)
{
if(steep)
{
PlotPixel(y, x, color);
}
else
{
PlotPixel(x, y, color);
}

error -= dy;
if(error < 0)
{
y += ystep;
error += dx;
}
}
}

Я получил это, немного изменив код здесь:http://rosettacode.org/wiki/Bitmap/Bresenham’s_line_algorithm#C.2B.2B

1
По вопросам рекламы [email protected]