Переезд

Разработка текущей статьи по ссылке прекращена в связи с переходом на новый движок документации. Новая статья доступна здесь.

Что это?

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

Оглавление

Разработка

Статья находится в разработке, так что вам выпала уникальная возможность лайкать и комментировать задавать вопросы, которые будут впоследствии освещены в статье. На данный момент, список пожеланий выглядит так:
  • Двигать по прямой, (нахождение угла между точками (два способа через координаты и через atan2))
  • Движение к цели (каждый раз находить угол)
  • Движение по кругу
  • Движение по параболе (для прыжков)
  • Что делать если нужно не искать точку внутри фигуры а пересечение с кругами заданного радиуса, квадратами и многоугольниками

Полезные ссылки

`
ОЖИДАНИЕ РЕКЛАМЫ...
30
Vlod, ключевое слово почему. Вот ты сейчас на глаз быстро скажешь, какой угол получится, tu->u или u->tu?
18
Vlod, ключевое слово почему. Вот ты сейчас на глаз быстро скажешь, какой угол болучится, tu->u или u->tu?
Протестировать 2 минуты, в целом можно обернуть в функцию, но без интерфейсов и женериков остается сухой матан
30
Протестировать 2 минуты
Отличный план, Волтер. И как на основании этого более сложные вычисления делать? Тестировать 20 минут, 200, 2000?
27
Была у меня тема создать симметричную точку относительно прямой.
У прямой есть угол AB. Нужно сначала найти кратчайшее расстояние от точки до прямой, в нашем случае это B. Потом просто повернуть точку на 𝜋 относительно B.
Ну, я понимаю как это сделать.. однако, это бывает на функцию с коордами много вычислении приходит. Плюс, исходные данные задачи были другие у меня
  • прямая e выражена коэ-тами a,b,c
  • точка px,py
Найти симметричную x,y от px,py
Ясно что относительно точки p строится перпендикуляр от прямой e. И потом поворот. Ну, у нас коэ-ты. Я короче, не знал как проверить правильно ли вышло. Я где-то надыбил формулы перехода a,b,c => точку, углы, и проверял вроде работает. А правильно, это уже неизвестна. Не всегда можно проверить. Формально сделал несколько проверок, и работает. На деле, я попробовал тест сделвть относительно горизонтальной e (коэ-ты некоторые обнулил),
Пусть в общем уравнении прямой один из коэффициентов A или B – нулевой, а C ≠ 0, т.е. уравнение прямой имеет вид
Ax+C = 0 или By+C = 0.
Эти уравнения можно записать в виде
x = a и y = b .
Таким образом, прямая в уравнении которой отсутствует одна из координат, параллельна оси отсутствующей координаты
Почему я брал горизонтальные или вертикальные прямые? Легче проверять симметричные точки. Когда прямая под углом, сложно проверить
Ну и вывод: и все пошло по одному месту.. там и деление на ноль, и кучу неточностей. Формулы нуждаются в переделках. Проверки пришллсь добавить. Все получилось. А и в координатах знаки перевернуты.. мне показалось, что что то не так и забросил

исходный код
Без всяких правок, какой есть
  1. относительно прямой e ищем перпендикуляр pe, тут коэф-ты a,b местами меняем, не трогая c
  2. ищем точку пересечения x0,y0 прямых e и pe (не допустить деления на ноль). Она и будет точкой перпендикуляра
  3. потом симметричная (тут я даже не понял, что я делаю. Кажется понял, помните когда ищем середину отрезка x0=(x1+x2)/2, y0=(y1+y2)/2. Только теперь, надо найти x1,y1 или x2,y2
--вектор нормали (перпендикулярный)
function NormalVectorLine(a,b,c)
	return a,b
end

function PerpendicularLine(x1,y1,a,b,c)

	--снимаем вектор нормали из ax+by+c=0
	local x2,y2=NormalVectorLine(a,b,c)
	
	--уравнение составим по точке x1,y1 и направляющему вектору x2,y2
	
	--уравнение перпендикулярной линии ax1+by1+c1=0 
	local a1,b1,c1 = (y2-y1),(x1-x2),a*(y2-y1)+b*(x2-x1)
	
    --проверка, что линия перпендикулярна
	local p = a1*(x2-x1) + b1*(y2-y1)
	if p==0 then 
	    print("перпедикулярны "..p)
	else
	    print("не перпедикулярны "..p)
	end
	
	return a1,b1,c1
end
function LinesIntersect(a1,b1,c1, a2,b2,c2)
	local x = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
	local y = (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
	return x,y
end
function PointOnLine(x,y,x1,y1,x2,y2)
	return(x - x1) * (y2 - y1) - (y - y1) * (x2 - x1)==0
end
function SymmetricalPointAboutLine(x,y,a,b,c)
	--Находим прямую line 2, которая перпендикулярна текущей прямой line 1.
	local a1,b1,c1=PerpendicularLine(x,y,a,b,c)
	--точка пересечения прямых
	local x0,y0=LinesIntersect(a1,b1,c1, a,b,c)
	--теперь находим симметричную точку, как известно x0,y0 - середина точки
	local px,py=2*x0-x,2*y0-y
	
	if PointOnLine(px,py,x0,y0,x,y) then
		print('симметричная точка px,py принадлежит прямой line 2')
	else
		print('симметричная точка px,py не принадлежит прямой line 2')
	end
	--проверяем одинаковы ли отрезки
	if ((x-x0)^2+(y-y0)^2)^0.5 == ((px-x0)^2+(py-y0)^2)^0.5 then
		print('длины отрезков одинаковы, координаты px,py верны')
	else
		print('длины отрезков не равны, координаты px,py не верны')
	end
	return px,py
end
print(SymmetricalPointAboutLine(-1,1,3,4,-12))
30
прямая e выражена коэ-тами a,b,c
Передать их в функцию и получить две рандомные точки на прямой. Ну а дальше по накатанной.

Да и как ты писал выше - нужно решать прикладную задачу. Какую именно задачу ты решал с помошью ax + bx + c = 0?
27
Но там такой задачи с симметричной точкой нет. НО там есть другие примеры, где в качечтве вводных данных были коэ-ты ax + bx + c=0 . Или пример нельзя использовать обратные тригонометрические функц. Потом я гуглил, и находил вкусные формулы. Значит, что это полезно, и где то применяются. Плюс, можно доказывать чисто коэ-тами условия коллинеарности, перпендикулярности и др чисто коэ-тами.

Но здесь есть задача с симметричной точкой.. но нет возможности проверить, и примеров тоже нет.

Да и как ты писал выше - нужно решать прикладную задачу. Какую именно задачу ты решал с помошью ax + bx + c = 0?
Ни какую. Я слишком туп для этого
8
Почитал, то чувство, когда только сейчас допер, как реально устроен триггерный прыжок.
30
когда только сейчас допер, как реально устроен триггерный прыжок.
Ну так ради этого и затевалось, чтоб хоть какое-то понимание было. А то весёлая ситуация получается, когда люди умеют швырять снаряды по дуге, а построить произвольный квадрат уже не выходит.
30
Вышла новая версия! Прокрутить к ресурсу
Расстояние между углами было заменено на угол поворота и использован более простой способ его нахождения.
Загруженные файлы
27
nazarpunk, что расстояние между углами не прокатила?
Гитхаб имеет поддержку для мобилы? Просто на мобиле ужасно трудно визуализировать эти чуда
30
что расстояние между углами не прокатила?
Вводит в заблуждение и не гуглится.
Гитхаб имеет поддержку для мобилы?
Имеет, но мне лень с тач событиями возиться. Да и карты на ПК разрабатывают.
8
Ждем продолжения уроков по геометрии в варе
30
Мне вообще не понятны, когда юзеры говорят используй "векторы". Если они то же самое ичпользуют, только таймером изменяем. Пример офериста. Я понял как там. Вы имеет в виду систему векторов? Создается вектор, т.е. по простому это функц с вводными данными типа координат точки x,y,z. Это вектор? Мне кажется нет. Или dx,dy,dz проще? А где же позиция юнита? Это мы к нему вектор приделываем для удобства. Ну как пример статьи офериста подошел. Тут уже меняется способ работы, привычные полярки уходят. Просто неудобно зачем менять. Нету примеров, где вам удобно это юзать. Наверно нужно сравнение полярок и системы векторов. Типа это эффективно, меньше вычислении, меньше кода. Да ребят?
Всё просто. Векторы удобней из-за их математики. Например те же столкновения, трения, гравицапа. На полярках + параболе идеально делать простые снарядики. Но когда дело дойдёт до чего-то сложнее, то уже будет печаль.
Например простое взаимодействие - подбрасываем юнита и швыряем в него молоток. Считать такую траекторию на полярках будет очень весело.
Ну или ледяная горка с трамплином.
38
Ого, миллениалы изобрели векторы. Ждем матрицы трпнсформаций
8
Как же мощно, каждый день обновления, по лайкаю за старание.
Повод ещё раз перечитать с начала.
27
nazarpunk, похож на метод расширения многоугольника. Только вот не совсем подходит, когда нужно с выпуклым мноугольником работать при расширении. Такая система края обрежет, будет совсем другой мноугольник. Надо будет на компе потестить)
30
Надо будет на компе потестить)
Мобильная версия добавлена в приоритеты. Правда я хз как нормально сделать.

похож на метод расширения многоугольника.
Там этих методов больше одного и не нашёл ничего общего. Вот прекрасная цитата из википедии:
Представьте себе доску, в которую вбито — но не по самую шляпку — много гвоздей. Возьмите верёвку, свяжите на ней скользящую петлю (лассо) и набросьте её на доску, а потом затяните. Верёвка окружает все гвозди, но касается она только некоторых, самых внешних. В таком положении петля и окружённая ей область доски являются выпуклой оболочкой для всей группы гвоздей.
30
Последние новости!
Была полностью переписана координатная сетка, добавлена поддержка мобильных устройств.
Прада все эти нововведения применены только к одному блоку:
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.