Раздел:
Триггеры и объекты

Что это?

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

Оглавление

Разработка

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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
27
8 месяцев назад
1
nazarpunk, вот еще один пример. Относительные повороты
Это полезно. Как поворачивать несколько снарядов относительно чего то. Или строить чего. Была у меня тема создать симметричную точку относительно прямой. В данных есть коорды точки, и уравнение прямой ax+by²+c=0. И там не уверен, что правильно решил в вычислительноц геометрии. Я попробовал, дебажить, она неверно работает.
1
29
8 месяцев назад
Отредактирован nazarpunk
1
вот еще один пример. Относительные повороты
Я эту методу использую в своих прямоугольниках, чтоб развернуть их паралельно осям.
0
29
8 месяцев назад
Отредактирован nazarpunk
0
Была у меня тема создать симметричную точку относительно прямой.
У прямой есть угол AB. Нужно сначала найти кратчайшее расстояние от точки до прямой, в нашем случае это B. Потом просто повернуть точку на 𝜋 относительно B.
Загруженные файлы
0
37
8 месяцев назад
0
У float ноль - это бесконечно малое. На бесконечно малое делить можно. Получаются +/-INF. Арифметика рациональных чисел никуда не делась

См пункт 3.1 habr.com/ru/articles/112953
0
18
8 месяцев назад
0
нигде не видел, почему в Atan2 передают разницу координат
  local real dx = GetUnitX(tu) - GetUnitX(u)
  local real dy = GetUnitY(tu) - GetUnitY(u)
  local real angle = Atan2(dy, dx)
0
29
8 месяцев назад
Отредактирован nazarpunk
0
Vlod, ключевое слово почему. Вот ты сейчас на глаз быстро скажешь, какой угол получится, tu->u или u->tu?
0
18
8 месяцев назад
0
Vlod, ключевое слово почему. Вот ты сейчас на глаз быстро скажешь, какой угол болучится, tu->u или u->tu?
Протестировать 2 минуты, в целом можно обернуть в функцию, но без интерфейсов и женериков остается сухой матан
0
29
8 месяцев назад
0
Протестировать 2 минуты
Отличный план, Волтер. И как на основании этого более сложные вычисления делать? Тестировать 20 минут, 200, 2000?
0
27
8 месяцев назад
Отредактирован MpW
0
Была у меня тема создать симметричную точку относительно прямой.
У прямой есть угол 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))
0
29
8 месяцев назад
0
прямая e выражена коэ-тами a,b,c
Передать их в функцию и получить две рандомные точки на прямой. Ну а дальше по накатанной.

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

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

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