Координаты "бесконечной" линии, проходящей через заданные точки
Иногда требуется посчитать координаты "бесконечной" линии, проходящей через точки отрезка (P1,P2) и ограниченной областью видимости ARect. ARect это чаще всего ClipRect холста, на котором рисуется линия.
#geom_code
Иногда требуется посчитать координаты "бесконечной" линии, проходящей через точки отрезка (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)
Точки P1, P2, P3 кликабельны и таскабельны
Если внутри отрезка - зелёный, если на точках отрезка - жёлтый, мимо отрезка - красный.
Для определения принадлежности точки отрезку использован пост.
Исходник (zip) 61 Кб Delphi XE 7,10,11
Прога (zip) 915 Кб
#geom_code
// 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 Кб
Просто рисовашка.
Предназначена исключительно для оформления чего-либо.
Принцип:
Текст рисуется, как путь, с уменьшающейся шириной пера.
Перу изначально задан цвет со значением альфа = 256 / ширина пера.
Из-за последовательного наложения прозрачность с каждым слоем всё меньше.
Правда, при смешивании, может измениться и цвет )))
Одним словом, вот поле экспериментов:
Исходник (zip) 61 Кб Delphi XE 7,10,11
Прога (zip) 940 Кб
👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Простые плазмы на гармониках
В количестве восьми - внизу слева комбобокс.
Принципиально не отличаются, только параметрами квази-гармонических колебаний.
- Используется 8-битная битовая матрица, Scanline и палитра.
- Для формирования палитры использовано смещение по HLS.
- Процедура DrawPlasm8 безусловно нуждается в оптимизации при реальном применении. Сейчас это мешаниниа синусов со смещениями и прочей ерундовины. Но зато можно поиграться с параметрами. Когда оптимизируешь, уже не получится поиграться.
Исходник (zip) 60 Кб. Delphi XE 7,10,11
Прога (zip) 877 Кб.
В количестве восьми - внизу слева комбобокс.
Принципиально не отличаются, только параметрами квази-гармонических колебаний.
- Используется 8-битная битовая матрица, Scanline и палитра.
- Для формирования палитры использовано смещение по HLS.
- Процедура DrawPlasm8 безусловно нуждается в оптимизации при реальном применении. Сейчас это мешаниниа синусов со смещениями и прочей ерундовины. Но зато можно поиграться с параметрами. Когда оптимизируешь, уже не получится поиграться.
Исходник (zip) 60 Кб. Delphi XE 7,10,11
Прога (zip) 877 Кб.
🔥3👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Оптимизированная плазма по просьбам трудящихся
Изменения:
- Теперь в выпадающем списке действительно 8 заявленных элементов (а не 7 по факту).
- Пункт 1.1 разбит на два подпункта:
1.1.0 - это плазма без оптимизации;
1.1.1 - та же самая плазма с оптимизацией.
Как видно на гифе визуально изменений никаких, но скорость у 1.1.1 почти в 3 раза выше, чем у 1.1.0.
За счёт чего:
1) Деления переведены в константы (PI/...);
2) Убраны лишние вычисления в цикле (sin(y * PI45)/8);
3) Вожделенная таблица синусов (sin_(...)).
Дополнительную оптимизацию в таких штуках можно достигнуть ещё за счёт упрощения формул, уменьшения числа операторов.
Исходник (zip) 61 Кб. Delphi XE 7,10,11
Прога (zip) 878 Кб.
Изменения:
- Теперь в выпадающем списке действительно 8 заявленных элементов (а не 7 по факту).
- Пункт 1.1 разбит на два подпункта:
1.1.0 - это плазма без оптимизации;
1.1.1 - та же самая плазма с оптимизацией.
Как видно на гифе визуально изменений никаких, но скорость у 1.1.1 почти в 3 раза выше, чем у 1.1.0.
За счёт чего:
1) Деления переведены в константы (PI/...);
2) Убраны лишние вычисления в цикле (sin(y * PI45)/8);
3) Вожделенная таблица синусов (sin_(...)).
Дополнительную оптимизацию в таких штуках можно достигнуть ещё за счёт упрощения формул, уменьшения числа операторов.
Исходник (zip) 61 Кб. Delphi XE 7,10,11
Прога (zip) 878 Кб.
🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Эффект пламени. GDI+
Я уже использовал этот эффект тут.
Сейчас просто вынес два похожих алгоритма в отдельную тему.
Одинарный клик на поле - старт/стоп таймера.
Двойной клик сбросит огонь в стартовую нижнюю позицию.
Исходник (zip) 61 Кб. Delphi XE 7,10,11
Прога (zip) 910 Кб.
Я уже использовал этот эффект тут.
Сейчас просто вынес два похожих алгоритма в отдельную тему.
Одинарный клик на поле - старт/стоп таймера.
Двойной клик сбросит огонь в стартовую нижнюю позицию.
Исходник (zip) 61 Кб. Delphi XE 7,10,11
Прога (zip) 910 Кб.
🔥7
Договорился...
По запросу Артёма в поворотнике изображения появилась направляющая сетка.
Я обещал сделать в марте )))
Оставались последние часы
По запросу Артёма в поворотнике изображения появилась направляющая сетка.
Я обещал сделать в марте )))
Оставались последние часы
👍4🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Пламенный текст. GDI+
Трудно удержаться, чтобы не объединить этот текст и этот эффект.
Что получилось - в заставке.
Дополнительные полезняшки в исходнике:
- Получить размеры текста для GDI+
- Получить полупрозрачный TGPBitmap
Одинарный клик на поле - старт/стоп таймера.
Двойной клик сбросит огонь в стартовую нижнюю позицию.
Исходник (zip) 61 Кб. Delphi XE 7,10,11
Прога (zip) 908 Кб.
Трудно удержаться, чтобы не объединить этот текст и этот эффект.
Что получилось - в заставке.
Дополнительные полезняшки в исходнике:
- Получить размеры текста для GDI+
- Получить полупрозрачный TGPBitmap
Одинарный клик на поле - старт/стоп таймера.
Двойной клик сбросит огонь в стартовую нижнюю позицию.
Исходник (zip) 61 Кб. Delphi XE 7,10,11
Прога (zip) 908 Кб.
🔥5👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Синусоидальный волновой эффект
Применимо для анимации флага, например.
Сам эффект без чего либо экзотического, всё на обычных TBitmap'ах.
При выводе использую GDI+ исключительно из-за приятного масштабирования.
И, конечно, наша любимая таблица синусов!
По проге:
- Параметры волны в подвале окна: Амплитуда, Частота, Вертикально/Горизонтально.
- За фазу отвечает таймер. Клик по полю - остановить/запустить таймер.
Вики: Статья по синусоидальной волне.
Исходник (zip) 215 Кб. Delphi XE 7,10,11
Прога (zip) 1.08 Мб.
Применимо для анимации флага, например.
Сам эффект без чего либо экзотического, всё на обычных TBitmap'ах.
При выводе использую GDI+ исключительно из-за приятного масштабирования.
И, конечно, наша любимая таблица синусов!
По проге:
- Параметры волны в подвале окна: Амплитуда, Частота, Вертикально/Горизонтально.
- За фазу отвечает таймер. Клик по полю - остановить/запустить таймер.
Вики: Статья по синусоидальной волне.
Исходник (zip) 215 Кб. Delphi XE 7,10,11
Прога (zip) 1.08 Мб.
🔥6👍2
VirtualTreeView for Delphi XE 11
Понадобился под XE11. У автора компонента такой версии нет. Поэтому небольшие телодвижения:
1. Качаем у автора.
2. В Delphi Tools-Options-Language-Library в поле Library Path добавляем путь к исходникам (картинка).
3. В Delphi открываем \Packages\RAD Studio 10.3\VirtualTreeView.groupproj
4. Compile All, нас выбрасывает в модуль VirtualTreesR.
5. В VirtualTreesR {$IMPLICITBUILD OFF} меняем на {$IMPLICITBUILD ON}
6. Compile All, нас выбрасывает в модуль VirtualTreesD.
7. Убираем VirtualTreesR:
9. Встаём на VirtualTreesD26.bpl и по правой кнопке - Install.
Отпишитесь, если есть возможность, как у кого прошло.
Понадобился под XE11. У автора компонента такой версии нет. Поэтому небольшие телодвижения:
1. Качаем у автора.
2. В Delphi Tools-Options-Language-Library в поле Library Path добавляем путь к исходникам (картинка).
3. В Delphi открываем \Packages\RAD Studio 10.3\VirtualTreeView.groupproj
4. Compile All, нас выбрасывает в модуль VirtualTreesR.
5. В VirtualTreesR {$IMPLICITBUILD OFF} меняем на {$IMPLICITBUILD ON}
6. Compile All, нас выбрасывает в модуль VirtualTreesD.
7. Убираем VirtualTreesR:
requires8. Compile All - всё должно быть ок.
DesignIDE{,
VirtualTreesR};
9. Встаём на VirtualTreesD26.bpl и по правой кнопке - Install.
Отпишитесь, если есть возможность, как у кого прошло.
👍6🔥3
Поиск двух максимально удалённых друг от друга точек в массиве
// Uses: + System.Types,Зачем это понадобилось, сейчас опубликую ))) Много в сообщении не напишешь, зато искать и копипастить удобно.
// System.Generics.Collections, System.Math
function FindFurthestPoints(
const A: TArray<TPointF>;
out P1, P2: TPointF): Boolean;
var
D, DMax : Double;
M, N: TPointF;
i, j: Integer;
begin
Result := Length(A)>1;
if not Result then exit;
DMax := MinDouble;
for i := 0 to High(A)-1 do
begin
M := A[i];
for j := i+1 to High(A) do
begin
N := A[j];
D := sqr(N.X-M.x)+sqr(N.Y-M.y);
if D > Dmax then
begin
DMax := D;
P1 := N;
P2 := M;
end;
end;
end;
end;
👍6🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Разделить массив точек на две прямоугольные области
Понадобилось сделать быстрый поиск ближайших точек в громадном массиве координат. Кое-что набросал в процессе. Показалось полезным показать наброски.
Тут решается задача быстро получить прямоугольные области, включающие в себя все точки массива и, по возможности, мало пересекающиеся друг с другом.
1) Поиск двух максимально удалённых точек в массиве.
2) Бежим по массиву, определяем к кому ближе очередная точка и формируем соответствующий прямоугольник.
3) Корректировка результата в том случае, если все точки оказались ближайшими только к одно из двух.
Точки можно ставить кликом, можно нажать "Добавить". В этом случае добавиться несколько случайных точек в количестве, указанном в левом нижнем SpinEdit'е.
Если есть мысли по оптимизации, поделитесь )))
Исходник (zip) 61.4 Кб. Delphi XE7.
Прога (zip) 932 Мб.
Понадобилось сделать быстрый поиск ближайших точек в громадном массиве координат. Кое-что набросал в процессе. Показалось полезным показать наброски.
Тут решается задача быстро получить прямоугольные области, включающие в себя все точки массива и, по возможности, мало пересекающиеся друг с другом.
1) Поиск двух максимально удалённых точек в массиве.
2) Бежим по массиву, определяем к кому ближе очередная точка и формируем соответствующий прямоугольник.
3) Корректировка результата в том случае, если все точки оказались ближайшими только к одно из двух.
Точки можно ставить кликом, можно нажать "Добавить". В этом случае добавиться несколько случайных точек в количестве, указанном в левом нижнем SpinEdit'е.
Если есть мысли по оптимизации, поделитесь )))
Исходник (zip) 61.4 Кб. Delphi XE7.
Прога (zip) 932 Мб.
👍6🔥3
OpenGL: Тестовое задание
Когда-то делал в одну контору. Остались исходники. Написано за ночь )
Чуть подрихтовал сейчас.
Задание (253 Кб)
Картинки для тестов (2 Мб)
Исходник (192 Кб) Delphi XE7
Прога (1.05 Мб)
Когда-то делал в одну контору. Остались исходники. Написано за ночь )
Чуть подрихтовал сейчас.
Задание (253 Кб)
Картинки для тестов (2 Мб)
Исходник (192 Кб) Delphi XE7
Прога (1.05 Мб)
👍7🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Infinite Text. GDI+
Пятница. Вечер.
Наткнулся на такой интересный эффект (CSS+JS).
Воспроизвел в дельфи.
Исходник (61 Кб) Delphi XE7
Прога (910 Кб)
Пятница. Вечер.
Наткнулся на такой интересный эффект (CSS+JS).
Воспроизвел в дельфи.
Исходник (61 Кб) Delphi XE7
Прога (910 Кб)
👍8🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Сеть из точек. GDI+
Давно хотел сделать в дельфи этот эффект.
Исходник (61 Кб) Delphi XE7
Прога (930 Кб)
Давно хотел сделать в дельфи этот эффект.
Исходник (61 Кб) Delphi XE7
Прога (930 Кб)
🔥12
g10.gif
13.5 MB
Метель. GDI+
Вот такой эффект метели получился.
Посмотреть в браузере - Метель JS.
Для, собственно, бури:
- В проге включить Image и Auto.
- На сайте включить Автобурю.
Как обычно, свою картинку в проге можно вставить через контекстное меню "Paste" в окне отрисовки.
Исходник (193 Кб) Delphi XE7
Прога (1.06 Мб)
Вот такой эффект метели получился.
Посмотреть в браузере - Метель JS.
Для, собственно, бури:
- В проге включить Image и Auto.
- На сайте включить Автобурю.
Как обычно, свою картинку в проге можно вставить через контекстное меню "Paste" в окне отрисовки.
Исходник (193 Кб) Delphi XE7
Прога (1.06 Мб)
🔥9
This media is not supported in your browser
VIEW IN TELEGRAM
Kd-Tree. Быстрый поиск в K-мерном пространстве
У меня был отпуск в начале мая.
Отпуск - прекрасное время для решения сильно тревожащих вопросов.
Меня сильно тревожил вопрос с Kd-Tree и проблемой наибыстрейшего поиска ближайшей точки.
Для себя его решил, о чём и предоставляю материал.
Kd-Tree - это дерево поиска на гигантском массиве K-мерных данных.
Суть - построение индекса. Что получилось, судить вам.
Читать статью...
У меня был отпуск в начале мая.
Отпуск - прекрасное время для решения сильно тревожащих вопросов.
Меня сильно тревожил вопрос с Kd-Tree и проблемой наибыстрейшего поиска ближайшей точки.
Для себя его решил, о чём и предоставляю материал.
Kd-Tree - это дерево поиска на гигантском массиве K-мерных данных.
Суть - построение индекса. Что получилось, судить вам.
Читать статью...
🔥11
This media is not supported in your browser
VIEW IN TELEGRAM
Текст из "Звёздных войн". GDI+
Попросили сделать такой эффект.
Всё оформлено в одну функцию. Можно менять угол наклона, шрифт подхватит из холста. Текст, естественно, модифицируем.
Перспектива сделана на основе статьи Вывести текст в перспективе.
Кнопка Set Text установит новый текст и перезапустит показ.
Исходник (531 Кб) Delphi XE7
Прога (1.35 Мб)
Попросили сделать такой эффект.
Всё оформлено в одну функцию. Можно менять угол наклона, шрифт подхватит из холста. Текст, естественно, модифицируем.
Перспектива сделана на основе статьи Вывести текст в перспективе.
Кнопка Set Text установит новый текст и перезапустит показ.
Исходник (531 Кб) Delphi XE7
Прога (1.35 Мб)
🔥13👍1