Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Рисование фигур с антиалиасингом   Найти похожие ветки 

 
Gero ©   (2006-01-12 22:27) [0]

Требуется рисовать произвольные отрезки/окружности с антиалиасингом.
Поискал в сети, нашел пару статей и алгоритмов на alglib.sources.ru, но какие-то они некрасивые получаются.
Никто не сталкивался с подобным? Может у кого-то есть какие-то наработки?
Что угодно: код, статьи, краткие описания идеи алгоритма...


 
Джо ©   (2006-01-12 22:28) [1]

А почему бы не GDI+?


 
Gero ©   (2006-01-12 22:30) [2]

Не хотелось бы, она не у всех есть. Да и мне кажется, это из пушки по воробьям.


 
Джо ©   (2006-01-12 22:33) [3]

> [2] Gero ©   (12.01.06 22:30)
> Не хотелось бы, она не у всех есть.

Библиотека (gdiplus.dll, да это всего один мегабайтный файл) свободно распространяется и работает на операционках начиная с 98. Умельцы даже почти без проблем ставят на 95.


 
Kantor   (2006-01-12 22:35) [4]

Graphic Gems в трех томах, там есть описания различных способов сабжа, есть в сети, где-то есть даже реализация описанных там алгоритмов на C.


 
Gero ©   (2006-01-12 22:35) [5]

> Джо ©   (12.01.06 22:33)

Может оказаться, что у кого-то не будет. А программа к графике никак не относится, нужно всего-то пару отрезков нарисовать. Не хотелось бы отсеивать потенциальных пользователей из-за такой мелочи.


 
Kantor   (2006-01-12 22:36) [6]

Сори, правильно: "Graphics Gems"


 
Gero ©   (2006-01-12 22:46) [7]

> Kantor   (12.01.06 22:35)

Спасибо, буду качать.


 
antonn ©   (2006-01-13 06:09) [8]

Gero ©   (12.01.06 22:27)
а на форуме "исходников" смотрел?


 
antonn ©   (2006-01-13 06:11) [9]

а вообще вот:

procedure Alias(var SourceBitmap:TBitmap; CanvasOut:TCanvas; _R:TRect);
const
 MaxPixelCount = MaxInt div SizeOf(TRGBTriple);
type
 PRGBArray = ^TRGBArray;
 TRGBArray = array[0..MaxPixelCount-1] of TRGBTriple;
var
 x,y,cx,cy,cxi,totr,totg,totb,i: Integer;
 Row1,Row2,Row3,DestRow: PRGBArray;
begin
 for Y:=0 to (SourceBitmap.Height div 3)-1 do begin
   cy := y*3;
   DestRow := SourceBitmap.ScanLine[y];
   Row1:=SourceBitmap.ScanLine[cy];
   Row2:=SourceBitmap.ScanLine[cy+1];
   Row3:=SourceBitmap.ScanLine[cy+2];
  for x := 0 to (SourceBitmap.Width div 3)-1 do begin
     cx := x*3;
     totr := 0; totg := 0; totb := 0;
       for i := 0 to 2 do begin
         cxi := cx + i;
         totr := totr + Row1[cxi].rgbtRed + Row2[cxi].rgbtRed + Row3[cxi].rgbtRed;
         totg := totg + Row1[cxi].rgbtGreen + Row2[cxi].rgbtGreen + Row3[cxi].rgbtGreen;
         totb := totb + Row1[cxi].rgbtBlue + Row2[cxi].rgbtBlue + Row3[cxi].rgbtBlue;
       end;
       DestRow[x].rgbtRed := totr div 9;
       DestRow[x].rgbtGreen := totg div 9;
       DestRow[x].rgbtBlue := totb div 9;
   end;
  end;
 CanvasOut.CopyRect(_R,SourceBitmap.Canvas,rect(0,0,SourceBitmap.Width div 3,SourceBitmap.Height div 3));
end;

procedure BitmapPrepare(var SourceBitmap:Tbitmap; CanvasOut:TCanvas; _R:TRect);
begin
SourceBitmap.PixelFormat:=pf24bit;
SourceBitmap.Width:=(_r.Right-_r.Left)*3;
SourceBitmap.Height:=(_r.Bottom-_r.Top)*3;
SourceBitmap.Canvas.CopyRect(rect(0,0,SourceBitmap.Width,SourceBitmap.Height),CanvasOut,_R);
end;

использование:
procedure TForm1.Button1Click(Sender: TObject);
var _Bitmap:Tbitmap;
begin
_Bitmap:=TBitmap.Create;
 try

BitmapPrepare(_Bitmap,Image1.Picture.Bitmap.Canvas,rect(10,10,200,200)); //берем прямоугольник, в котором будет рисовать

//дальше работаем с _Bitmap.canvas как нам надо

_Bitmap.Canvas.Pen.Width:=3; //устанавливаем толщину в 3 раз больше

_Bitmap.Canvas.Ellipse(20*3,20*3,80*3,80*3);
_Bitmap.Canvas.MoveTo(50*3-1,60*3-1); //все координаты в 3 раза больше (хотя для лучшего эффекта, можно отнять еденицу - будет более смазано и качественно, главное не переборщить:))
_Bitmap.Canvas.LineTo(5*3,15*3);

_Bitmap.Canvas.Brush.Style:=bsclear;
_Bitmap.canvas.Font.Size:=_Bitmap.canvas.Font.Size*3; //тут правда косячно с размером...
_Bitmap.canvas.TextOut(2,2,"Im - super :)");

Alias(_Bitmap,Image1.Picture.Bitmap.Canvas,rect(10,10,200,200)); //вывод

 finally
_Bitmap.Free;
 end;
end;

(с) antonn


 
MBo ©   (2006-01-13 06:49) [10]

http://www.antigrain.com/
http://www.simdesign.nl/tips/tip002.html


 
megabyte-ceercop ©   (2006-01-13 10:41) [11]

Мультисамплинг. Рисуешь на промежуточном битмапе с разрешением в четыре (например в четыре) раза больше без антиальяса и потом попиксельно переносишь на целевую поверхность, уменьшая изображение в четыре раза.
Берешь цвета 16 точек на промежуточной поверхности (квадрат 4х4), вычисляешь для них среднии цвет - это будет цвет для соответствующей точки на целевой поверхности.
Самый правильный способ.
Только не забывай что и лининию на промежуточной поверхности нужно рисовать в четыре раза толще.


 
Gero ©   (2006-01-13 13:05) [12]

Всем ответившим — спасибо, а особенное спасибо MBo!



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

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
15-1136987158
Lexer
2006-01-11 16:45
2006.02.05
Компьютер не вреден для здоровья


3-1134117590
Behemoth
2005-12-09 11:39
2006.02.05
Не могу определиться с RAID...


6-1130173528
Kostya
2005-10-24 21:05
2006.02.05
Обработка ошибок в TidHTTP


10-1107878782
arick
2005-02-08 19:06
2006.02.05
Flash ActiveX компонент


15-1137427249
oldman
2006-01-16 19:00
2006.02.05
Опрос...