IP76.RU Графика. Математика. Delphi.
103 subscribers
101 photos
2 files
151 links
Алгоритмы, исходники, теория, GDI, GDI+, D2D
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Эллипс под углом и координаты точки наклонного эллипса

Небольшой эпос про то, как повернуть эллипс и найти координату точки на нем, отстоящей на заданный угол от оси X.

https://ip76.ru/coord-rot-ellipse/
🔥2
Аргумент для отказа участвовать в проекте с "дружной командой единомышленников"
This media is not supported in your browser
VIEW IN TELEGRAM
Пересечение произвольной прямой и наклонного эллипса

Продолжение темы наклонного эллипса. На этот раз рассматривается метод получения координат пересечения произвольной прямой и наклонного эллипса.

https://ip76.ru/line-rotate-ellipse/
🔥1
Дмитрий Осипов
Графика в проектах DELPHI

Книга потрясная.
Во времена, когда осваивал GDI+ она была настольной.
Куча полезной информации, как по Windows GDI, так и GDI+.
Рекомендую.

Дабы избежать нарушения авторских прав, даю ссылку на не свой ресурс. Там потребуют регистрацию для скачивания. Регистрация безболезненна )))

Скачать книгу (8.5 Мб)
🔥3👍1
Отличная читалка, установки не требует.
Небольшой по размеру просмотрщик PDF, DjVu, Comic Book Archive, FB2, ePub, XPS, TCR, многостраничных TIFF, TXT, PalmDoc, EMF, WMF, BMP, GIF, JPG, JPEG, PNG, PSD, PCX, DCX, MOBI, AZW для Microsoft Windows, бесплатный для некоммерческого использования. До версии 1.6 был бесплатен полностью.

Скачать portable версию с www.IP76.ru (3.5 Мб)

Скачать читалку с www.stdutility.com
Друзья!

К сожалению, времени сейчас на новые статьи нет.
К тому же, сайт в настоящее время переносится на русский хостинг.
Буржуйский хостер вначале попросил добровольно свалить до окончания подписки.
Затем, не дожидаясь в моем случае октября, стал злонамеренно тормозить.

В отношении картинки. Она очень понятна фрилансерам.
Большинство заказчиков делает вид, что вообще не понимает про что это.
Прямо как буржуйский хостер.

Одним словом, своих статей пока нет.
Буду публиковать чужие интересности.

10 уловок заказчиков, чтобы платить Вам меньше
Написано давно, но ничего не изменилось.
👍2🔥1
Друзья! Всем привет!

IP76.RU успешно переехал на beget.com.
Но времени по-прежнему катастрофически нет.
Поэтому небольшая подборка справочных ссылок по Delphi.
Периодически туда заглядываю.
Надеюсь, информация будет полезной.

Borland Compiler Conditional Defines
Compiler Versions

Иногда требуется подсмотреть номер версии для {$if CompilerVersion >= ...}

Нововведения по версиям Delphi

Полезны в том числе и ссылки внутри статьи.

Hidden hints and warnings options

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

Если есть интересные справочные ссылки, делитесь в комментариях. Возможно, потом пригодится для раздела "Полезные ссылки".
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Жирная пунктирная линия в Delphi.Canvas

Всем известно, что в стандартном Canvas средствами Delphi нарисовать пунктирную линию, толщиной больше единицы, невозможно. На самом деле возможно. Просто надо добавить самую малость GDI API.
Также показано, как можно использовать растровое изображение вместо цвета линий.

https://ip76.ru/bold-dot-line/
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Пользовательский стиль пера. Часть I: GDI

Пользовательский стиль пера - это набор штрихов заданной длины и интервалов между ними.
Однако, такой стиль можно использовать не обязательно для задания собственной штриховки.
Например, можно сделать бегущую линию, бегущий контур текста, эффект "бегущих муравьёв", как в PhotoShop'е.

Одним словом, читаем и критикуем 😊
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Пользовательский стиль пера. Часть II: Бегущие муравьи

Рисуем рамку бегущих муравьёв в GDI и GDI+.
Для GDI+ аж два метода - хороший и очень хороший )))
Всё запаковано в класс, можно брать и запросто использовать.
Как использовать - всё подробно расписано, исходники как обычно в комплекте.

Почитать...
🔥4
Пользовательский цвет в диалоге TFontDialog

В стандартном виде TFontDialog не позволяет выбрать произвольный цвет для шрифта.
Вот небольшой код, позволяющий это сделать.
Находка не моя. Источник: stackoverflow.
Показалось весьма полезным, чтобы сохранить для будущих копипастов.

Полюбопытствовать...
🔥2👍1
Контур текста в GDI с антиалиасом

Рисуем контур текста без использования чего либо стороннего и не трогаем GDI+
Казалось бы, невозможно. Но возможно )))

Статья тут...
🔥2
Сегодня часто спрашивали у сайта -
Принадлежит ли точка отрезку?
Небольшой ответ на него таков:

// Uses: System.Math, System.Types
// Принадлежность точки P отрезку (P1,P2)
// с учетом попадания на P1 и P2
// Режим нахождения на отрезке: 0 - мимо,
// 1 - P1, 2 - P2, 3 - между P1 и P2
function PtInSegment(const P1, P2, P: TPointF;
Eps: Double = 1e-2): Integer;
begin
Result := 0;
if P1.EqualsTo(P, Eps) then exit(1)
else if P2.EqualsTo(P, Eps) then exit(2)
else
if SameValue(Abs(p1.Y-p.Y) + Abs(p2.Y-p.Y),
Abs(p2.Y-p1.Y), Eps) and
SameValue(Abs(p1.X-p.X) + Abs(p2.X-p.X),
Abs(p2.X-p1.X), Eps) and
SameValue((p.x-p1.x)*(p2.y-p1.y) -
(p.y-p1.y)*(p2.x-p1.x), 0, Eps)
then
Result := 3;
end;

Подробнее тут...
#geom_code
👍1🔥1
SpinEdit: как убрать кнопки
Ещё один интересный вопрос к сайту.
Например, можно так:

procedure RemoveSpinEditButtons(
ASpinEdit: TSpinEdit);
var i: Integer;
begin
with ASpinEdit do
for i := 0 to ComponentCount-1 do
begin
if Components[i] is TSpinButton then
TSpinButton(Components[i]).Visible :=
False;
end;
end;
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Аффинная матрица масштаба

Блок накопившихся вопросов

Что происходит с масштабом при аффинных преобразованиях?
Если специально не задано преобразование масштаба, то с масштабом ничего не происходит.

Аффинные преобразования: меняется ли масштаб при преобразованиях, при каком?
Меняется при наличии в композиции преобразования масштаба.

Формула для масштабирования координат на плоскости
x' = x * Sx
y' = y * Sy

Применение аффинного преобразования для растяжения изображения
Если коэффициенты масштаба по X (Sx) и Y (Sy) не совпадают, то будет и растяжение, и сжатие. Например, меняя Sx и не трогая Sy(=1), мы получим растяжение/сжатие по горизонтали.

Матрица отражения

Исходник того, что на заставке (zip) 59.5 Кб. Delphi XE 7, XE 10, XE 11

Экзешник того, что на заставке (zip) 909 Кб.
🔥3👍1
Как вычислить координаты второй точки если известно расстояние и угол?
Последние несколько дней вопрос прямо в ТОПе.

Если надо просто получить точку P2 от точки P1 с углом A от оси X на расстоянии L, то просто делаем так:
  SinCos(A*PI/180, sn, cs);
P2.X := p1.X + cs * L;
P2.Y := p1.Y + sn * L;

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

Функция для расчёта координат точки, отстоящей от произвольной прямой (P0,P1) на угол A (от точки P1) и расстояние L:

function CalcPolarCoord(const P0, P1: TPointF;
A, L: Single): TPointF;
var
B, C: Single;
begin
B := ArcTan2(P0.Y-P1.Y, P0.X-P1.x);
C := A * PI/180 + B;
Result.X := p1.X + cos(C) * L;
Result.Y := p1.Y + sin(C) * L;
end;

#geom_code
👍3🔥1
Вопрос: Как квадрат превратить в трапецию с помощью аффинных преобразований?
Ответ: Никак.
Потому что:
Трапе́ция — выпуклый четырёхугольник, у которого две стороны параллельны, а две другие стороны не параллельны.
Аффи́нное преобразование — отображение плоскости или пространства в себя, при котором параллельные прямые переходят в параллельные прямые, пересекающиеся — в пересекающиеся, скрещивающиеся — в скрещивающиеся.
Квадрат — это правильный четырёхугольник. У него все стороны и углы равны между собой. Противолежащие стороны квадрата параллельны друг другу.

Невозможно применить аффинное преобразование так, чтобы две параллельные стороны стали не параллельны. Это противоречит определению. Поскольку при аффинных преобразованиях сохраняется параллельность, параллелограммы переходят в параллелограммы, а трапеции в трапеции. Только так.
👍4
Хорошая статья про массивы
Особенно в части динамических массивов.
🔥3👍1
Координаты "бесконечной" линии, проходящей через заданные точки

Иногда требуется посчитать координаты "бесконечной" линии, проходящей через точки отрезка (P1,P2) и ограниченной областью видимости ARect. ARect это чаще всего ClipRect холста, на котором рисуется линия.

procedure CalcEndlessLine(const ARect: TRectF;
const P1, P2: TPointF; out V, W: TPointF);
var A,B,C: Double;
begin
B := p2.x - p1.x;
if Abs(B) > 0.01 then
begin
A := p2.y - p1.y;
C := A/B;
V.x := ARect.Left;
W.x := ARect.Right;
V.Y := p1.Y + C*(V.x-p1.X);
W.Y := p2.Y + C*(W.x-p2.X);
end
else
begin
V := PointF(p1.X, ARect.Top);
W := PointF(p2.X, ARect.Bottom);
end;
end;

#geom_code
👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Найти перпендикуляр из точки P3 на прямую (P1,P2)

// Uses: System.Types
function CalcPerpendicularBase(
const P1, P2, P3: TPointF): TPointF;
var
dx, dy, L, A: Extended;
begin
dx := P2.x-P1.x;
dy := P2.y-P1.y;
L := dx*dx + dy*dy;
if IsZero(L) then exit(P1);

A := ((P3.x - P1.x) * dx +
(P3.y - P1.y) * dy) / L;
Result.x := P1.x + A * dx;
Result.y := P1.y + A * dy;
end;

Точки P1, P2, P3 кликабельны и таскабельны
Если внутри отрезка - зелёный, если на точках отрезка - жёлтый, мимо отрезка - красный.
Для определения принадлежности точки отрезку использован пост.

Исходник (zip) 61 Кб Delphi XE 7,10,11
Прога (zip) 915 Кб
#geom_code
👍4🔥3
Текст с размытым контуром. GDI+

Просто рисовашка.
Предназначена исключительно для оформления чего-либо.

Принцип:
Текст рисуется, как путь, с уменьшающейся шириной пера.
Перу изначально задан цвет со значением альфа = 256 / ширина пера.
Из-за последовательного наложения прозрачность с каждым слоем всё меньше.
Правда, при смешивании, может измениться и цвет )))
Одним словом, вот поле экспериментов:

Исходник (zip) 61 Кб Delphi XE 7,10,11
Прога (zip) 940 Кб
👍3🔥1