Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Вниз

Быстрая фрагментация треугольника. Как?   Найти похожие ветки 

 
@!!ex ©   (2008-07-25 14:55) [0]

Самый просто вариант - это получить область, которую занимает тругольник(Это квадрат).
Перебрать все пиксели квадрата, проверить с какой сторны пиксель находится относительно каждого ребра. Если знак отрицательный для всех трех ребер, значит пиксель внутри теругольника...
Но этож жуть как медленно.... Есть ли способ быстрее???


 
Сергей М. ©   (2008-07-25 15:05) [1]

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


 
Ega23 ©   (2008-07-25 15:08) [2]

Решить систему линейных уравнений?


 
@!!ex ©   (2008-07-25 15:09) [3]

Нужно нарисовать график на Canvasе.
График задан картой высот, хранится в bmpшке.
Сейчас рисуется с помощью Canvas.Polygon(), но это плохо подходит, поскольку полигон заливается весь одним цветом, а нужно сделать плавный цветовой переход в пределах одного примитика.


 
Правильный$Вася   (2008-07-25 15:34) [4]

PtInRegion
?
может, проще побить треугольник на несколько частей?


 
Сергей М. ©   (2008-07-25 15:39) [5]


> @!!ex ©   (25.07.08 15:09) [3]


Так может тебе регионами воспользоваться ?

см. справку "Region Functions"


 
@!!ex ©   (2008-07-25 15:48) [6]

Вот нашел по фрагментации:
http://compgraphics.info/2D/triangle_rasterization.php

Пробую реализовать.


 
Sapersky   (2008-07-25 16:20) [7]

Нашёл у себя код. Писался он 8 лет назад, поэтому эффективностью не блещет, но вроде работает.

Type
 TRealPoint = record
   x,y : Real;
 end;
 TPoints3 = array[1..3] of TRealPoint;
 TColors3 = array[1..3] of Byte;

   function getlength(x1,y1, x2,y2 : Real):Real;
   begin
   Result:=sqrt(((x2-x1)*(x2-x1)) + ((y2-y1)*(y2-y1)));
   end;

   procedure DrawTriangle(const points : TPoints3; const colors : TColors3);
   Var iMin, iMax, iMid : Byte;
       i,n : Integer;
       arry : array[1..3] of Real;
       d1,d2,d3 : Boolean;
       dx1,dx2,dx3,x1,x2 : Extended;
       p,l1,l2,l3,l,c1,c2 : Real;

     procedure HLine(x1,x2:Real; y:Integer; i1,i2 : Real);
     Var x,xn,xe,dx : Integer;
         c,r,g,b : Byte;
         l1,l2,l3,di,i : Real;
     begin
     xn:=Round(x1); xe:=Round(x2);
     If xn=xe then Exit;
     If xn>xe then begin dx:=xn; xn:=xe; xe:=dx; di:=i1; i1:=i2; i2:=di; end;
     di:=(i2-i1)/(xe-xn);
     i:=i1;
     For x:=xn to xe do begin
       c:=Round(i);
       buffer.Canvas.Pixels[x,y]:=RGB(c,c,c);
       i:=i+di;
     end;
     end;

   begin
   iMin:=1; iMax:=1; iMid:=0;
   For i:=1 to 3 do
     If points[i].y<points[iMin].y then iMin:=i;
   For i:=1 to 3 do
     If points[i].y>points[iMax].y then iMax:=i;
   For i:=1 to 3 do
     If (i<>iMin) and (i<>iMax) then
     begin iMid:=i; Break; end;

   l1:=(GetLength(points[iMin].x,points[iMin].y,points[iMax].x,points[iMax].y));

   l2:=GetLength(points[iMin].x,points[iMin].y,points[iMid].x,points[iMid].y);
   l3:=GetLength(points[iMax].x,points[iMax].y,points[iMid].x,points[iMid].y);
   arry[1]:=points[iMax].y-points[iMin].y;
   arry[2]:=points[iMid].y-points[iMin].y;
   arry[3]:=points[iMax].y-points[iMid].y;
   d1:=True; d2:=True; d3:=False;
   If arry[1]=0 then begin d3:=True; end;
   If arry[2]=0 then d1:=False;
   If arry[3]=0 then begin d2:=False; end;
   dx1:=0; dx2:=0; dx3:=0;
   If not d3 then dx1:=(points[iMax].x-points[iMin].x)/arry[1];
   If d1 then dx2:=(points[iMid].x-points[iMin].x)/arry[2];
   If d2 then dx3:=(points[iMax].x-points[iMid].x)/arry[3];
   x1:=points[iMin].x; x2:=x1;

   If d1 then
     For n:=Round(points[iMin].y) to Round(points[iMid].y)-1 do begin
       l:=GetLength(x1,n,points[imin].x,points[iMin].y)/l2;
       p:=GetLength(x2,n,points[imin].x,points[iMin].y)/l1;
       c1:=(colors[iMin]*(1-l))+colors[iMid]*l;
       c2:=(colors[iMin]*(1-p))+colors[iMax]*p;
       HLine(x1,x2,n,c1,c2);
     x1:=x1+dx2; x2:=x2+dx1;
   end;
   x1:=points[iMid].x;
   If d2 then
     For n:=Round(points[iMid].y) to Round(points[iMax].y)-1 do begin
       l:=GetLength(x1,n,points[iMid].x,points[iMid].y)/l3;
       p:=GetLength(x2,n,points[imin].x,points[iMin].y)/l1;
       c1:=(colors[iMid]*(1-l))+colors[iMax]*l;
       c2:=(colors[iMin]*(1-p))+colors[iMax]*p;
       HLine(x1,x2,n,c1,c2);
     x1:=x1+dx3; x2:=x2+dx1;
   end;
   end;


 
Rouse_ ©   (2008-07-26 00:20) [8]


> Сейчас рисуется с помощью Canvas.Polygon(), но это плохо
> подходит, поскольку полигон заливается весь одним цветом,
>  а нужно сделать плавный цветовой переход в пределах одного
> примитика.

Эмн, может стоит обратить внимание на GDI+? Там градиентная заливка  произвольных областей делается в две-три строчки...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.005 c
2-1217239959
AlekseyB
2008-07-28 14:12
2008.09.07
База данных MS SQL


2-1217331791
Оксана Вл.
2008-07-29 15:43
2008.09.07
Удаление


15-1216181257
dreamse
2008-07-16 08:07
2008.09.07
Написание спам фильтра


2-1217423928
ZLO
2008-07-30 17:18
2008.09.07
Файловые потоки NTFS


2-1217169031
AlexanderMS
2008-07-27 18:30
2008.09.07
Процедура, вызываемая при ошибке в программе.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский