crypt of decay - что-то я совсем математику эту вашу забыл [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

что-то я совсем математику эту вашу забыл [Jan. 9th, 2014|04:57 am]
Previous Entry Add to Memories Tell A Friend Next Entry
алё, есть тут кто живой с математикой внутри? а напомните мне, пожалуйста, как сделать вот такое.

есть у нас некий вектор, в направлении которого движется круг. в процессе движения этот круг въехал в прямоугольник. задача: «вытолкнуть» круг из прямоугольника в направлении, обратном тому, по которому круг заехал на тюрьму. то есть, не просто «в сторону вытолкнуть», а именно по тому направлению, по которому груг ехал. при этом вытолкнуть надо не «просто на сколько угодно», а чтобы круг касался стороны прямоугольника. вот вам мегакартинка для ясности:

вот эта круглая зараза ехала-ехала и заехала. и теперь её надо оттянуть назад, чтобы она (круглая зараза) просто касалась прямоугольника. то есть, посчитать, на какое точно расстояние надо «отъехать» назад. причём расстояние сие должно быть минимальным. то есть, если потенциально круг можно отодвинуть на два расстояния (для двух сторон прямоугольника), то на минимальное. ну ладно, минимальное из двух я сам выберу, как хотя бы расстояния найти?

я жопой чую, что я что-то забыл, и у этой задачи есть очень простое решение, но никак не могу ни вспомнить, ни слов для гугеля подобрать.

вот что значит — больше десяти лет не пользоваться и даже не вспоминать. мне стыдно. не надо писать о том, что мне должно быть стыдно, пожалуйста.
Linkmeow!

Comments:
[User Picture]
From:[info]maa_boo
Date:January 9th, 2014 - 10:49 am
(Link)
Ну если исходники Box2D читать не влом, то там такая задача решается. Искать, разумеется, по слову "penetration".
[User Picture]
From:[info]ketmar
Date:January 9th, 2014 - 10:53 am
(Link)
да оно понятно, что решается. только это… корявый говноспособ у меня уже есть. если я начну читать бокс2д — у меня будет два корявых говноспособа.

и вообще, я бы эту задачу решил, если бы В ДОМЕ, БЛЯДЬ, БЫЛА СРАНАЯ РУЧКА! ну нет у меня пространственного воображения, пока не нарисую — не пойму. а xpaint — это пытка, я лучше киркорова буду петь.

всё ещё надеюсь, что кто-то придёт и организует мне халяву. ну должно же в новом году мне повезти?
[User Picture]
From:[info]maa_boo
Date:January 9th, 2014 - 11:00 am
(Link)
Ну, feci, quod potui, faciant meliora potentes.

Если б я такие задачки умел решать…
[User Picture]
From:[info]ketmar
Date:January 9th, 2014 - 11:22 am
(Link)
ну всё равно спасибо за попытку, я даже не надеялся, что кто-нибудь хоть что-то по теме напишет.
[User Picture]
From:[info]maa_boo
Date:January 9th, 2014 - 11:29 am
(Link)
Это Мише спасибо, я ж через его ленту всех вас читаю. =)
From:(Anonymous)
Date:January 9th, 2014 - 11:13 am
(Link)
>киркорова буду петь
Во, уважаю.
[User Picture]
From:[info]ketmar
Date:January 9th, 2014 - 11:21 am
(Link)
а в детстве я ещё и крестиком вышивал. нет, честно!
[User Picture]
From:[info]ketmar
Date:January 9th, 2014 - 10:54 am
(Link)
и, кажется, глядя на свою потрясающую артистизмом иллюстрацию, я внезапно получил +2 к интеллекту и артефактный меч ОЗАРЕНИЕ.
[User Picture]
From:[info]ketmar
Date:January 9th, 2014 - 12:17 pm
(Link)
спасибо, я знаю, как найти минимальное расстояние от точки до линии. вопрос был совсем-совсем не об этом. если бы мне нужно было просто выдвинуть кружок нахуй хоть куда-нибудь, тоже не было бы проблем. но его надо сдвинуть именно назад, и уже постфактум. правда, есть 100% гарантия того, что он не влез в прямоугольник полностью, и чётко задевает максимум два ребра.
From:(Anonymous)
Date:January 9th, 2014 - 02:57 pm
(Link)
\
\|-----
\
|\

пусть y=ax+b -- прямая, по которой центр круга ехал, и центр (сейчас) на ней лежил. те. y_Onow=ax_Onow+b
пусть (0,0) -- координаты верхнего угла прямоугольника.
ищем х0.у0 -- коодр центра круга.

b<0, -b/a > R ==> yO:=-R, xO :=(R-b)/a

b<0, -b/a < R ==> (1+aa)xxO+bb+2abxO=RR ==> x0:=sqrt((2ab)^2=4(1+aa)bb/(2(1+aa))

b>0, +b/a > R ==> xO:= R, yO :=aR+b

b>0, +b/a < R ==> (1+aa)xxO+bb+2abxO=RR ==> x0:=sqrt((2ab)^2=4(1+aa)bb/(2(1+aa))

Но это не все---нужно еще сделать аналогичные проверки для других углов прямоугольника.
[User Picture]
From:[info]ketmar
Date:January 9th, 2014 - 03:04 pm
(Link)
спасибо, я посплю и вникну.

а угол чётко один, чит такой. больше, чем на пол-шишечки круг не влезет, трэйсер не даст.
From:(Anonymous)
Date:January 9th, 2014 - 06:59 pm
(Link)
там разбор трех вариантов: в искомом положении круг касается (1) вертикальной либо (3) горизонтальной стороны, либо (2,4) вершины.
соотв нужно истать точку на прямой движения либо с коорд х или у равн радиусу, либо же на расстоянии радиус от вершины
[User Picture]
From:[info]ketmar
Date:January 10th, 2014 - 04:41 am
(Link)
шота я, блядь, нихуя не понял. похоже, придётся таки брать ручку, бумажку, и вспоминать всю эту ёбаную механику. а то бездумно с напрыгу реализовать не вышло.

кстати, тупое, медленное и лобовое решение — повернуть мир так, чтобы круг ехал точно по горизонтали (или вертикали, один хуй). %-)
From:(Anonymous)
Date:January 9th, 2014 - 07:01 pm
(Link)
(1+aa)xxO+bb+2abxO=RR должно быть (1+aa)*x0*xO+b*b+2*a*b*xO=R*R
From:[info]phantom
Date:January 10th, 2014 - 10:40 am
(Link)
"Выдвинуть кружок" - решить задачу о касании стороны прямоугольника окружностью. Для этого в уравнение расстояния до прямой надо подставить сторону прямоугольника как прямую, радиус окружности как расстояние и точку, лежащую на прямой, по которой движется окружность. Второй вариант - касание окружности вершины прямогольника - там ещё проще.
[User Picture]
From:[info]ketmar
Date:January 10th, 2014 - 12:05 pm
(Link)
извини, туплю атомно просто. пятнадцать лет почти ничего этого не трогал, мозги заржавели, думать лень. к тому же мне чтобы подумать — надо нарисовать, а я в доме сраной ручки найти не могу, гыг. а на технике, увы, рисовать такие штуки мне неудобно ужасно.

ну ладно, халява не прокатила. я таки думал — вдруг прочитерить выйдет, даст кто-нибудь копипасты сишной. ну да ладно, всё равно никогда не любил пасту, которую не понимаю. возьму ручку и бумажку и докажу себе, что я почти не хуже школоты, гыг.
From:(Anonymous)
Date:January 10th, 2014 - 01:13 pm
(Link)
Сначала думал использовать мощь геометрии за восьмой класс (ну там, все углы прямоугольного треугольника известны, катет - радиус тоже, найти гипотенузу элементарно) но потом подумал еще: ведь окружность должна быть строго на расстоянии радиуса. То есть все возможные радиусы окружности образуют квадрат со скругленными краями вокруг квадрата!
Найти уравнения отрезков этого скругленного квадрата очень просто, а затем можно найти координаты точки пересечения вектора с этими отрезками
From:(Anonymous)
Date:January 10th, 2014 - 01:38 pm
(Link)
короче, сначала пишем функцию, которая берет квадрат, обрисовывает вокруг него скругленный квадрат со сторонами, удаленными от него на расстояние радиуса окружности.
потом пишем функцию, которая берет этот новый квадрат и вектор и возвращает координаты точки пересечения вектора и этого квадрата, это и будет искомая точка радиуса окружности, если я не тупанул конечно
From:[info]remedie
Date:January 10th, 2014 - 10:19 pm
(Link)
Искренне сочувствую. Сам неоднократно попадал в такие ситуации, когда математика вдруг нужна, а не лезет совершенно. С аспирантуры математику не трогал, ну и она меня... А вообще у нас ведь тут есть несколько математиков, почему бы и не попросить их.
[User Picture]
From:[info]ketmar
Date:January 11th, 2014 - 01:52 am
(Link)
>А вообще у нас ведь тут есть несколько математиков, почему бы и не попросить их.
да стыдно как-то. это как к Чаку Норрису приходить с просьбой соседского хулигана Сёмку поколотить.
From:[info]remedie
Date:January 11th, 2014 - 04:00 am
(Link)
Ну вообще древние вон не гнушались целые трактаты по элементарной геометрии писать. Чего тут постыдного. Стыдно мне сейчас, например, из-за того, что гляжу на твой пример и понимаю, что настолько всё забыл. Завтра посмотрю на свежую голову, может даже код напишу для примера.Авось выйдет нормальное решение.
[User Picture]
From:[info]ketmar
Date:January 11th, 2014 - 04:05 am
(Link)
да и мне стыдно — я классе в девятом-одиннадцатом такие задачи и за задачи не считал. а ещё сраная прокрастинация: вместо действительно взять ручку, листок и немного теории, убеждаю себя, что я устал-и-хочу-спать/ещё-не-проснулся/ну-вот-ещё-чуть-чуть-и-начну/…
[User Picture]
From:[info]ketmar
Date:January 13th, 2014 - 04:54 pm
(Link)
дык в прошлом посте писал. всегда чётко axis-aligned, вариантов не бывает.
[User Picture]
From:[info]ketmar
Date:January 13th, 2014 - 04:55 pm
(Link)
а, бля. в этом посте. писал. или не писал. %-)