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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.013 c
15-1137359086
Kerk
2006-01-16 00:04
2006.02.05
Убила фраза :)


1-1135847480
dust
2005-12-29 12:11
2006.02.05
Переменная содержащая тип


15-1137249400
ferr
2006-01-14 17:36
2006.02.05
ICQ


15-1137422765
Интересно мне
2006-01-16 17:46
2006.02.05
Планирование закупок сырья на производство!


6-1130344439
cerber
2005-10-26 20:33
2006.02.05
Запуск скрипта в HTML документе, загруженном в WebBrowser?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский