Переезд

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

Что это?

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

Оглавление

Разработка

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

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

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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
что расстояние между углами не прокатила?
Вводит в заблуждение и не гуглится.
Гитхаб имеет поддержку для мобилы?
Имеет, но мне лень с тач событиями возиться. Да и карты на ПК разрабатывают.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.