x1=10;
y1=15;
x2=67;
y2=50;
for (x=x1;x<x2;x++)
{
y=((((x-x1)/(x2-x1))*(y2-y1))+y1);
PutPixelXYLCD(x,y,1);//подпрограмма установки бита по заданному адресу
};
формула вывода прямой по двум точкам
Код:
но переменная y вообще не изменяется, поэтому линия получается только горизонтальной! Подскажите, с чем это связано?
Видимо переменные целочисленного типа?
Цитата: oltzowwa
Видимо переменные целочисленного типа?
да, unsigned char
При делении у тебя ж получаются дробные числа :)
В Вашем примере (x-x1) меньше по модулю, чем (x2-x1). поэтому (x-x1)/(x2-x1) равно 0, соответственно и всё первое слагаемое равно 0 и y==y1.
Ситуацию можно попытаться улучшить, если вычислять выражение в другом порядке: (x-x1)*(y2-y1)/(x2-x1)+y1. В этом случае, сначала выполнится умножение, потом деление и результат будет гораздо ближе к тому, который Вы ожидаете. Но (x-x1)*(y2-y1) легко может вызвать переполнение, со всеми вытекающими последствиями. Поэтому лучше сперва преобразовать операнды к какому-либо плавающему типу. Например так y=(float)(x-x1)/(float)(x2-x1)*(y2-x1)+y1. Но скорость работы такотго алгоритма очень низкая. Известен гораздо более эффективный алгоритм рисования линии - алгоритм Брезенхема. С некоторыми модификациями он применим и к рисованию окружности.
Код:
void circle (double x1,double y1, double radius)
{
for (x=x1-radius;x<x1+radius;x++)
{
y= sqrt(radius*radius-((x-x1)*(x-x1)))+y1;// рассчет окружности
yi=(unsigned char) y;
xi=(unsigned char) x;
PutPixelXYLCD(xi,yi,1);
y=y1- sqrt(radius*radius-((x-x1)*(x-x1)));// верхний полукруг
yi=(unsigned char)y;
PutPixelXYLCD(xi,yi,1);
}
}
{
for (x=x1-radius;x<x1+radius;x++)
{
y= sqrt(radius*radius-((x-x1)*(x-x1)))+y1;// рассчет окружности
yi=(unsigned char) y;
xi=(unsigned char) x;
PutPixelXYLCD(xi,yi,1);
y=y1- sqrt(radius*radius-((x-x1)*(x-x1)));// верхний полукруг
yi=(unsigned char)y;
PutPixelXYLCD(xi,yi,1);
}
}
окружность выводится, но почему-то не совсем четко, многие точки, ближе к горизонтальной оси не высвечиваются, как это улучшить??:)
Код:
...
double alfa=0;
while(a<6.28)// вот только не помню в сях какой угол в радианах или градусах
{
x=radiys*cos(alfa);
y=radiys*sin(alfa);
a+=0.001;
...
}
double alfa=0;
while(a<6.28)// вот только не помню в сях какой угол в радианах или градусах
{
x=radiys*cos(alfa);
y=radiys*sin(alfa);
a+=0.001;
...
}
И да,надо с достаточной точностью увеличивать угол,а то получится не сплошной круг,а из точечек:)
Цитата: cpentyc
а что если пробегать 360 градусов по окружности
Код:
...
double alfa=0;
while(a<6.28)// вот только не помню в сях какой угол в радианах или градусах
{
x=radiys*cos(alfa);
y=radiys*sin(alfa);
a+=0.001;
...
}
double alfa=0;
while(a<6.28)// вот только не помню в сях какой угол в радианах или градусах
{
x=radiys*cos(alfa);
y=radiys*sin(alfa);
a+=0.001;
...
}
А зачем нужно a? Почему нельзя использовать alfa
и еще, почему-то
Код:
alfa+=0,001
Код:
alfa++
А так все получилось, спасибо большое!:):)