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
Пример использования AlphaBlend

Как выяснилось, есть определённые вопросы, связанные с динамическим формированием альфа-канала. Вот пример, где всё рисуется исключительно AlphaBlend'ом. Альфа-наложение используется как статическое - одно значение на всю картинку, так и динамическое - формирование альфа-градиента.
Заодно, пример масштабирования через эту функцию. Можно посмотреть, как изменится скорость отрисовки при максимизированном окне.
Галка IsRight - работа с альфой более правильная, вид станет немного другой
Галка Crazy - станет истерить.
Описание функции AlphaBlend.
Как AlphaBlend смешивает цвета.

Исходник (2.6 Мб) Delphi XE7
Прога (3.0 Мб)
🔥10👍1
Маркус Бейкер. Скромный герой

Не так давно опубликовал сборник формул нахождения площади треугольника доселе никому неизвестного Маркуса Бейкера. Теперь это не так. Теперь ещё как известного!
Данил Близнец провёл замечательное скрупулёзное исследование и составил жизнеописание нашего героя. Приглашаю ознакомиться: Маркус Бейкер и его коллекция формул для площади треугольника.

И да, может быть кто-то скажет, у нас тут не исторический кружок. Но быть дотошным занудой в нашем деле, это очень приветствуется. Данил, спасибо, что закончил картину. 👍
👍8
OpenGL: Сглаживание краев. ARB-Multisample

Логичное развитие темы с 3D-моделью obj-формата. Теперь её надо отобразить в OpenGL, посмотреть, правильно ли прочитана модель из файла.
Модель прочитана правильно, но при отображении возникла проблема со ступенчатыми краями. Безусловно эстетическая, но сильно бесящая. Из-за которой двигаться дальше было нельзя никак.
Пришлось решать.
Ознакомиться как...
🔥6👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Другой алгоритм пламени

Давно ничего не придумывал не по работе. А тут появилось немного времени, и кто-то меня просил подумать про то, как сделать огонь, например, для факела или очага. Вот, мысли по этому поводу.

Исходник очень минималистичен и прост.
Пламя строится на путях, построенных на кривых Безье. Для закраски используется градиентная кисть сложной формы.
GDI+

Исходник (59 Кб) Delphi XE7
Прога (903 Кб)
🔥8🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Запоминаем таблицу синусов и косинусов навсегда )))
Поделились видео (youtube), где женщина лихо воспроизводит таблицу значений.
Такого метода не знал, был в восхищении, нашел вот такую интерпретацию, чтобы не заходить никуда.
🔥7
Ада Лавлейс - первый программист в истории человечества. Этот факт меня всегда восхищал 🔥

С праздником, милые дамы! 🌹🌹🌹

5 гениальных женщин-программистов и их вклад в развитие IT

До 1984 года женщин-программистов было больше, чем мужчин: 6 удивительных фактов о женщинах в IT
🔥7
Получение повёрнутого TBitmap средствами Windows GDI

История такая. Спросили, нет ли у меня готового исходника для поворота картинки. А у меня есть куча всего понаписанного, но не опубликованного. То времени нет, то азарт кончился. Поэтому, вот модуль, который получает повёрнутый битмап двумя способами. Вдруг пригодится ещё кому-нибудь. Без экзотики, чистый Win GDI:
1) Аффинные преобразования поворота
2) Использование API функции PlgBlt.

utlRotatePicGDI.zip
🔥12👍1
Дожили... Теперь 22 апреля - День Старого Программиста.
Старого, Карл! Раньше степень древности не обозначали.
Всех программистов сердечно поздравляю 🍾🤟🥳
А особенно выпускников специальности 2204.

День старого программиста — неофициальный профессиональный праздник, который отмечается ежегодно 22 апреля. Он возник среди советских и российских программистов, обучавшихся по специальности с кодом 2204 — «Программное обеспечение вычислительной техники и автоматизированных систем». Число 2204 символически интерпретируется как 22.04, то есть 22 апреля.

https://dzen.ru/a/aAeTmz3O9Q32Qz9W
👍7🔥5
Подключаем DeepSeek к Delphi
Купить API Key проблематично, в списке возможных помощников Delphi этой нейронки нет, а попробовать хочется. Поэтому:

1. Надо закачать себе DeepSeek. Инструкция. Ничего не смотрим, сразу листаем на пункт "5. Продвинутый способ: скачать Дипсик на компьютер".
2. По ссылке в этом пункте качаем и ставим LM Studio. Запускаем, идём в обзор моделей и выбираем DeepSeek Coder V2 Lite (10.4 Gb 😱) и качаем. Это необязательно, можно и на базовой, но он хотя бы про Delphi знает.
3. Из tray-меню студии запускаем сервер.
4. В Delphi опциях выбираем настройки Smart CodeInsight, включаем его, выбираем ChatGPT, указываем BaseURL=http://127.0.0.1:1234/V1 и Api key = not-needed. Из списка моделей выбираем deepseek-coder-v2-lite-instruct. Остальное на свой вкус.

Помощник так себе, но, думаю, найдутся желающие поэкспериментировать.
🔥5👍2🤔2
This media is not supported in your browser
VIEW IN TELEGRAM
Пересечение отрезков в 2D и 3D

Небольшая статья про нахождение пересечений отрезков в 2D и 3D. Теоретическая часть начинается с векторов и внезапно уходит в метод Крамера. Для любителей острых сюжетных поворотов.
Исходники, как обычно, в комплекте.

Читать статью...
👍7🔥6
Вычислить расстояние от точки P до отрезка AB
Также возвращает точку на отрезке. Максимально откомментировал каждое действие. Надеюсь, пригодится
function DistanceToSegment(
const P, A, B: TPointF;
out R: TPointF): Single;
var
AB, AP: TPointF;
DotProduct, Len, t: Single;
begin
// Вектор AB
AB := B-A;
// Квадрат длины отрезка AB
Len := AB.X*AB.X+AB.Y*AB.Y;
// Если отрезок вырожден (A и B совпадают)
if IsZero(Len, 1e-6) then
// То возвращаем расстояние от P до A
exit((A-P).Length);
// Вектор AP
AP := P-A;
// Вычисляем скалярное произведение
// векторов AB и AP
DotProduct := AB.DotProduct(AP);
// Вычисляем параметр t
// (нормализованная проекция)
t := DotProduct/Len;
// Ограничиваем t в пределах [0, 1]
t := EnsureRange(t, 0, 1);
// Находим ближайшую точку на отрезке
R := A + t*AB;
// Возвращаем расстояние между
// точкой P и проекцией
Result := (P-R).Length;
end;


#geom_code
🔥11
Как сделать чёрным системное меню элемента Windows

История такая. Однажды, в нашей группе прозвучала невозможность сменить цвет системного контекстного меню. Даже стилем. Но ведь это неправда, ИИ ошибается, и я рванулся было делать, как делал это когда-то давно. Но, учитывая, что с той поры приобрёл некоторый опыт, могу предложить другое решение. Собственно, статья про то, как отрисовать любое контекстное меню цветами вашей фантазии без особых знаний WinApi. И речь не идёт о подмене своими PopupMenu, работаем с тем, что есть.

Читать статью...
🔥8👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Кубический Сплайн Эрмита

Ещё один способ построить гладкую кривую, проходящую через все заданные точки ломаной.
Ни разу не сталкивался, решил посмотреть, что за зверь. Заодно подразобраться со сплайнами вообще. Поэтому теоретическая часть достаточно большая. В силу этого, про самого Эрмита ни слова, только про его сплайны.
Внутри исходники, как обычно. Плюс к этому: интерактивное построение сплайна (давно хотел вспомнить JS).

Читать статью...
🔥10
Список цветов Delphi
Даже не знал, что у них на сайте есть такая полезность
🔥5
Д. Роджерс, Дж. Адамс
Математические основы машинной графики


Неожиданный фидбэк. Увидели, какого качества у меня представлена эта книга в статье про кубический сплайн Эрмита и прислали вот...
Очень много математики, но зато очень подробно разжёвываются про всё, что только можно. Затронуты как двумерные, так и трёхмерные преобразования. Плоскости, кривые, проекции, и т.д. и т.п.
Сейчас пробую на вкус B-Spline. Там про это почти 100 страниц, ух...

Скачать (.djvu) 7.23 Мб
Книга большая, аккуратно!
👍3🔥3
Вычислить Z-координату точки P в 3D-треугольнике ABC по X,Y. Если попадает мимо треугольника, вернёт DefaultZ:
function GetZInTriangle(const P: TPointF;
const A, B, C: TPoint3D;
DefaultZ: Single = -1000): Single;
const Eps = 1e-10;
var d, u, v, w: Double;
begin
// Вычисляем знаменатель для
// барицентрических координат
d := (B.Y-C.Y)*(A.X-C.X) +
(C.X-B.X)*(A.Y-C.Y);
// Проверка на вырожденный треугольник
if IsZero(d, Eps) then
Exit(DefaultZ);
// Вычисляем барицентрическую координату u
u := ((B.Y-C.Y)*(P.X-C.X) +
(C.X-B.X)*(P.Y-C.Y))/d;
// Вычисляем барицентрическую координату v
v := ((C.Y-A.Y)*(P.X-C.X) +
(A.X-C.X)*(P.Y-C.Y))/d;
// Вычисляем третью координату w
w := 1 - u - v;
// Проверка, находится ли точка
// внутри треугольника
if (u >= -Eps) and (v >= -Eps) and
(w >= -Eps) then
// Интерполяция Z-координаты
Result := u*A.Z + v*B.Z + w*C.Z
else
Result := DefaultZ;
end;

#geom_code
👍4🔥3
Инструмент цветовой матрицы

Продолжаю мучить JS. Оторвался на стилях. Наверное, переборщил...
Давно хотел сделать такой инструмент.

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

26 предустановленных эффектов:
- Сепия
- Черно-белое
- Негатив
- Усиление красного
- Сдвиг в синий
- Ярче
- Темнее
- Зеленая матрица
- Цианотипия
- Винтаж
- Полароид
- Lomo Эффект
- Инфракрасный
- Кросс-процесс
- Сновидческий
- Янтарный монохром
- Соляризация
- Фильм-нуар
- Техниколор
- Дуплекс
- Винтаж (улучшенный)
- Зелёная матрица (другая)
- Холодный тон
- Тёплый тон
- Высокая контрастность
- Цианотипия (улучшенная)

Ознакомиться с инструментом можно тут
🔥7👍1
Шум Перлина: Разбор алгоритма

Разбор механики этого замечательного изобретения. Где математика становится частью естественного хаоса.
Это не просто математика — это поэзия, воплощенная в коде.
Внутри есть приятный интерактив и непременные исходники.

Приятного чтения!!!
🔥10
This media is not supported in your browser
VIEW IN TELEGRAM
Перспективная трансформация онлайн

Когда-то озадачился такой вещью, как перспективная трансформация. Теперь дошли руки сделать это онлайн.
- Сохраняет в PNG, фон прозрачный.
- Сохраняет и копирует в размерах оригинального файла.
- Ограничений на размер оригинального файла нет.

Новый инструмент в коллекции - перспективная трансформация
🔥9
Конвертер изображений в черно-белое

Сейчас совсем нет времени на полноценные статьи.
Поэтому, вот новый инструмент для преобразования исходного изображения в градации серого и истинно черно-белое. Умеет менять яркость-контраст-чёткость-резкость исходного изображения. Поддерживает количество градаций серого и дизеринг. Инструмент писать быстрее, чем статью.

Очень хотелось попробовать сделать дизеринг. Это когда в черно-белом изображении, если есть ограничения на используемые цвета (например, в истинно чёрно-белом только два цвета), имитируем градации определёнными узорами. Вот как дама справа на рисунке - там дизеринг, и там всего два цвета.

Инструмент тут...
🔥11
Напоминалка: Преобразовать число в строку без SysUtils

Всем нам известны такие функции, как IntToStr, FloatToStr и т.д. Что делать, если использовать SysUtils нельзя или нежелательно? Для этого существует ядерная процедура Str. Про которую не сразу и вспомнишь.

procedure Str(const X [: Width [:Decimals]]; var S: String);


Преобразует целое число или число с плавающей точкой X в строку, с возможностью указания необязательных настроек форматирования. Примеры и описание.

procedure TForm1.Button1Click(Sender: TObject);
var S: string;
begin
// '123'
Str(123, S); Label1.Caption := S;
// ' 123'
Str(123:30, S); Label2.Caption := S;
// ' 1.23456000000000E+0002'
Str(123.456, S); Label3.Caption := S;
// ' 1.23456000000000000E+0002'
Str(123.456:30, S); Label4.Caption := S;
// ' 123.4560'
Str(123.456:30:4, S); Label5.Caption := S;
end;
🔥3👍2