Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > прямые, проходящие через черные точки


Автор: toshkaexe 19.2.2007, 12:41
задача, есть точка на картинке с координатами (x,y) нужно нарисовать, например, при прямые(c определеннм наклоном), проходящие церез эту точку.
Код

for (i=0;i<360;i++)
        {

        x=x0+dlina*shirina*cos(fi*TORAD);
        y=y0+dlina*shirina*sin(fi*TORAD);
        Form1->Image2->Canvas->MoveTo(x0-x,y0-y);
        Form1->Image2->Canvas->LineTo(x0+x,y0+y);
        fi=fi+(360/10);


        }

это я сделал, теперь нужно е из N-ого количества прямых, проведеных через точку (x,y) оставить ту прямую, которая проходит через максимальное количество черных точек на картинке. подскажите, как это можно сделать.

Автор: AntonChik 19.2.2007, 13:26
делаешь массив int n[360]; обнуляешь все его элементы на всяк.случ.
в цикле перебираешь все точки каждой линии т.е. 
в своем коде вместо 
Код

     Form1->Image2->Canvas->MoveTo(x0-x,y0-y);
     Form1->Image2->Canvas->LineTo(x0+x,y0+y);

пишешь типо
Код

for (j=x0-x;j<x0+x;j++)
{
xx=j;
yy=(y0-y)+(xx-(x0-x))*(x/y);
if(Form1->Image2->Canvas->Pixels[xx][yy]==clBlack)n[i]++;
}
в конце ишешь три максимальных значения из n[360] smile
короче с математикой я мог накосячить, но зацепка думаю есть...

Автор: toshkaexe 19.2.2007, 13:44
Цитата(AntonChik @ 19.2.2007,  13:26)
делаешь массив int n[360]; обнуляешь все его элементы на всяк.случ.
в цикле перебираешь все точки каждой линии т.е. 
в своем коде вместо 
Код

     Form1->Image2->Canvas->MoveTo(x0-x,y0-y);
     Form1->Image2->Canvas->LineTo(x0+x,y0+y);

пишешь типо
Код

for (j=x0-x;j<x0+x;j++)
{
xx=j;
yy=(y0-y)+(xx-(x0-x))*(x/y);
if(Form1->Image2->Canvas->Pixels[xx][yy]==clBlack)n[i]++;
}
в конце ишешь три максимальных значения из n[360] smile
короче с математикой я мог накосячить, но зацепка думаю есть...

вопрос. почему три точки ищем?

Автор: AntonChik 19.2.2007, 13:50
а, ну да. эт я туплю - мне показалось что надо 3 прямых найти... ну да, ищи одно макс. значение из n[360] smile

Автор: toshkaexe 19.2.2007, 14:11
поясните формулу


yy=(y0-y)+(xx-(x0-x))*(x/y);

уравнение касательной? может быть вы имели виду     yy=(y-y0)+(xx-(x-x0))*(y/x);

только такое преобразование не рисует сплошные линии, а лишь точки... smile 

Автор: AntonChik 20.2.2007, 08:14
не касательной, а грубо говоря каждого диаметра...
почему лишь точки? ну а что мешает уменьшить интервал??? сделать не j++ ,а там j+=0.001 , ну естественно j есть float 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)