Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2013, 20:35   #1
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию Рисование "прямых" линий. Делфи

Вечер добрый.
Мой научный руководитель хочет программу для показа колебаний. Собственно мной была она написана.
Возникла проблема, когда рисуется косая линия, парабола, то рисуется она не так как например на доске мелом - ровно, а штрихами.
Уже и объяснял, что от меня это не зависит, рассказывал про матрицу и размер пикселей, и наглядно показывал на листке в клеточку, ни в какую. Подавай ему ровную линию и всё тут. Говорит, что ему делали проги где линия идеально ровна шла.... и что бы я ему не загонял и не уклонялся от работы дурдом.
Собственно возник вопрос, а может и правда как то можно нарисовать, к примеру параболу так, что бы отрисовывалась не штришками а плавной линией?
Буду рад хоть какой информации.
Artsiom вне форума Ответить с цитированием
Старый 06.05.2013, 20:51   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Как говорится, совершенству нет предела.

1. Собственно, вместо параболы рисуется ломаная. И если эта ломаная состоит из достаточно крупнвх "штрихов", это будет заметно на глаз. Штрихи следует делать поменьше. Возможно, адаптивной длины, чтобы между двумя соседними угол не превосходил некоторой заданной величины. Ну и т.д.

2. Если проблема не в том, что на линии видны штрихи, а в том, что на ней видны пискели - задача несколько усложняется. Для борьбы с таким эффектом применяется антиалиасинг. Грубо говоря, это выглядит так (в случае черной линии на белом фоне): рисуем линию хотя бы чуть шире, чем 1 пиксель. Вычисляем точно ее границы относительно границ пикселя. Если пиксель целиком внутри линии - рисуем черным. Если граница линии пересекает площадь пикселя, рисуем его оттенком серого, степень черноты при этом равна отношению площади черной части пикселя к его полной площади.
s-andriano вне форума Ответить с цитированием
Старый 06.05.2013, 20:59   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Сравнение парабол с антиалисингом и без:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.05.2013, 21:15   #4
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Ух ты.
Спасибо, будем-с разбираться.
Artsiom вне форума Ответить с цитированием
Старый 29.08.2013, 22:44   #5
МНС
Новичок
Джуниор
 
Регистрация: 29.08.2013
Сообщений: 1
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Сравнение парабол с антиалисингом и без:
Я понимаю, что это очень нагло, но не могли бы скинуть исходник этой проги?
МНС вне форума Ответить с цитированием
Старый 29.08.2013, 23:17   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

МНС, на форме PaintBox (не забудьте скачать gdi+):
Код:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  graphicsGDIPlus: TGPGraphics;
  pen: TGPPen;
  points: array [0 .. 2] of TGPPointF;
begin
  graphicsGDIPlus := TGPGraphics.Create(PaintBox1.Canvas.Handle);
  pen := TGPPen.Create(MakeColor(255, 0, 0, 0), 1);
  points[0] := MakePoint(20.0, 200);
  points[1] := MakePoint(60.0, 20);
  points[2] := MakePoint(100.0, 200);
  graphicsGDIPlus.SetSmoothingMode(0);
  graphicsGDIPlus.DrawCurve(pen, PGPPointF(@points), 3);
  graphicsGDIPlus.TranslateTransform(120, 0);
  graphicsGDIPlus.SetSmoothingMode(4);
  graphicsGDIPlus.DrawCurve(pen, PGPPointF(@points), 3);
  graphicsGDIPlus.ResetTransform;
  pen.free;
  graphicsGDIPlus.free;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04