Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Математика

Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр

Ответ
 
Опции темы
Старый 06.01.2007, 20:21   #1
Render
Знающий
 
Регистрация: 12.07.2006
Сообщений: 283
Написано 16 полезных сообщений
(для 32 пользователей)
В области квадрата

Есть следующая ситуация, покамись только для 2д. Есть прямоугольник, его ценгр расположен в центре координат, может быть повёрнут под любым углом. Описывается полностью математически.
Как узнать находится ли точка с координатами (x, y) внутри прямоугольника?
И как лучше в этом случае сделать описание прямоугольника? Можно задать 4 уравнения ограничивающих прямых, или ещё как то?
(Offline)
 
Ответить с цитированием
Старый 07.01.2007, 16:39   #2
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: В области квадрата

Можно сделать тупо в лоб.
Найти координаты вершин прямоугольника и точки в новой системе координат, которая повернута относительно исходной на тот же угол, что и пярмоугольник. Таким образом, в новой СК квадрат не повернут, и выполнить задачу не составит труда.

С уравнениями прямых, можеть быть, проще, но с ними необходимо будет или решить неравенство, или найти отклонения, с чем тоже связано немало мороки.
(Offline)
 
Ответить с цитированием
Старый 07.01.2007, 22:55   #3
jimon
 
Сообщений: n/a
Re: В области квадрата

alcoSHoLiK
да я тоже думаю что трансформация системы координат ето самое простое
 
Ответить с цитированием
Старый 08.01.2007, 01:49   #4
Render
Знающий
 
Регистрация: 12.07.2006
Сообщений: 283
Написано 16 полезных сообщений
(для 32 пользователей)
Re: В области квадрата

Спасибо за внимание. Но уже подсказали. Самый простой вариант кстати . Нужно всег-навсего повернуть точку на угол поворота прямоугольника, и проверить всего 4 условия. Вот и всё.
(Offline)
 
Ответить с цитированием
Старый 08.01.2007, 11:06   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Re: В области квадрата

Сообщение от Render
Спасибо за внимание. Но уже подсказали. Самый простой вариант кстати . Нужно всег-навсего повернуть точку на угол поворота прямоугольника, и проверить всего 4 условия. Вот и всё.
Что-то я немогу понять этот алгоритм... повернуть точку на угол и... и что тогда получится? точка будет совсем на другом месте...

Самый простой алгоритм, это всетаки переход к новой системе координат (систему координат надо повернуть на этот угол а не точку) как уже сказали alcoSHoLiK и jimon.

Другим алгоритмом может быть такой: т.к. прямоугольник находится в центре системы координат, то необходимо проверить с какой стороны от каждого отрезка (линии) прямоугольника находится точка. В аттаче я прикрепил отсканированную из справочника страничку. Особое внимание следует уделить замечанию №1 28-го параграфа
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 08.01.2007, 12:23   #6
Render
Знающий
 
Регистрация: 12.07.2006
Сообщений: 283
Написано 16 полезных сообщений
(для 32 пользователей)
Re: В области квадрата

Вот реализация с поворотом точки . Работает просто идеально.

Graphics 800,600,32,2
SetBuffer BackBuffer()

Local x=50,y=50,width=500,height=100,ang#=10

Repeat
Cls
DrawRect(x,y,width,height,ang)
Text 0,0,PointInRect(x,y,width,height,ang,MouseX(),Mous
eY())
Flip
Until KeyDown(1)

Function DrawRect(x#,y#,width#,height#,ang#=0)
Local x1#=x +width *Cos(ang)
Local y1#=y +width *Sin(ang)
Local x2#=x +height*Cos(ang+90)
Local y2#=y +height*Sin(ang+90)
Local x3#=x2+width *Cos(ang)
Local y3#=y2+width *Sin(ang)
Line x,y,x1,y1
Line x,y,x2,y2
Line x1,y1,x3,y3
Line x2,y2,x3,y3
End Function

Function PointInRect(x#,y#,width#,height#,ang#,px#,py#)
Local l#=Sqr((px-x)^2+(py-y)^2)
Local ang2#=ATan2(py-y,px-x)
Local px2#=x+l*Cos(ang2-ang)
Local py2#=y+l*Sin(ang2-ang)
If (px2>x+width) Or (px2<x) Or (py2>y+height) Or (py2<y) Then
Return False
Else
Return True
EndIf
End Function

З.Ы. Спасибо Frank за идею.
(Offline)
 
Ответить с цитированием
Старый 08.01.2007, 13:04   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Re: В области квадрата

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

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

PS: если хорошо изучишь ту отскнированную страничку, то сможешь написать алгоритм нахождения точки внутри любого выпуклого многоугольника . Кстати нахождение 6-и синусов/косинусов при отрисовке одного прямоугольника - это довольно ресурсоемкая задача.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 09.01.2007, 22:50   #8
Shtille
AnyKey`щик
 
Регистрация: 09.01.2007
Сообщений: 1
Написано 0 полезных сообщений
(для 0 пользователей)
Re: В области квадрата

Предложу вариант, разработанный мной. Для 2д работает 100%. 3д не проверял.
Итак, суть. Есть формула из аналита - расстояние от точки (x0,y0) до прямой A*X+B*Y+C=0 равно r=|A*x0+B*y0+C|, где n={A,B} - нормаль к прямой (|n|=1).
Если брать формулу без модуля, то легко проверяется условие нахождения точки в определенной полуплоскости.
Следовательно, чтобы точка лежала внутри прямоугольника, эти "безмодульные" расстояния до параллельных прямх должны быть разных знаков!
(Offline)
 
Ответить с цитированием
Старый 10.01.2007, 01:04   #9
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: В области квадрата

"Безмодульные расстояния" - это отклонения, о которых я говорил в посте #2)
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Области в 2д массиве. Данил BlitzMax 7 17.07.2009 19:32


Часовой пояс GMT +4, время: 20:10.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com