Ахтунк... Задачка. Геометрия. 3 класс.

pesto™
Чо то я наверно ребенка в школу не отдам...
0
WSV
От пользователя Guilty
Здравая мысль.


Только не простая. Формула любви тута...
0
От пользователя demiurg_ii
Таки 0 :-) ПОЛНЫЙ обход всех вершин делаем, по замкнутому контуру.

ну ты порисуй примерчики пока, потом доложишь :-)
0
demiurg_ii
От пользователя Жeнeчкa
чем доказывается

топологией. Для начала полагаем многоугольник а) замкнутой и б) ограниченной и в) односвязной фигурой.
Луч -- это на самом деле непрерывный путь из точки "бесконечность"(которая заведомо ВНЕ многоугольника) в точку, которая нас интересует. А граница многоугольника -- замкнутый контур. Так вот каждое первое пересечение контура на пути из одной точки в другую переводит нас из состояния ВНЕ контура в состояние ВНУТРИ контура. А каждое второе -- наоборот.
0
WSV
От пользователя demiurg_ii


Уважаемый, ваш метод уже полчаса назад разрисован примерчиками. Метод хорош и аксиоматический. Респегт.
0
От пользователя WSV
Есть n точек на плоскости с известными координатами [X1,Y1]...[Xn,Yn] (это чорные точки на рисунке)
Даёццо еще одна точка с координатами [Х0,Y0] - это красная точка на рисунке.
Как с помощью математиги посчитать попала красная точка в n-угольнег или нет?

так как нет условия в каком порядке соединяются точки
то
красная точка центр координат
если в во всех 4х четвертях есть хотябы 1 точка то, наша красная точка находится в геометрической фигуре)
1 / 4
От пользователя pesto
Чо то я наверно ребенка в школу не отдам...
:-d Страх не справиться если ребенок подойдет вдруг с вопросом? :-)
От пользователя demiurg_ii
топологией
:-) Просто-то как всё.
0
demiurg_ii
От пользователя WSV
Уважаемый, ваш метод уже полчаса назад разрисован примерчи

Дык я не претендую... :-) На самом, как показывает наша олимпиадная практика, лучший (всм, быстрее всех кодируется и меньше ошибок при сдаче работ возникает) -- метод, указанный Биореактором. Разумеется, если исходные данные более-менее задают последовательность вершин. :-)
0
От пользователя Тузя
красная точка центр координат
если в во всех 4х четвертях есть хотябы 1 точка то, наша красная точка находится в геометрической фигуре)


Оооо... Бинго! Так то идеальный вариант решения, хрен подкопаешься. Возможно это и есть нужный ответ.
А мы тут формулы, множества и т.п.
1 / 5
От пользователя Тузя
если в во всех 4х четвертях
какие четвертях ещё? :-)
От пользователя Тузя
есть хотябы 1 точка то
вовсе не факт, что
От пользователя Тузя
наша красная точка находится в геометрической фигуре)
2 / 0
_Cью_
От пользователя demiurg_ii
ВЫПУКЛЫЕ треугольники

а покажите мне ктонить ВПУКЛЫЙ треугольник! :-d
0
От пользователя Тузя
так как нет условия в каком порядке соединяются точки
то
красная точка центр координат
если в во всех 4х четвертях есть хотябы 1 точка то, наша красная точка находится в геометрической фигуре)

элегантно
1 / 3
demiurg_ii

---


[Сообщение изменено пользователем 25.07.2007 13:35]
3 / 0
_Cью_
можно составить систему неравенств, которая описывает данный нам многоугольник (а зная координаты вершин это сделать не сложно)
потом подставить в него координаты красной точки
удовлетворяет всем усовиям - ок, мы попали внутрь!
хоть одно не пошло - мы в пролете :-)
0
OldBoy4D
2Тузя

светлая голова
0 / 2
_Cью_
От пользователя Биореактор
элегантно

да, красиво
но не думаю что в 3 классе дети ваще знают что такое система координат, а две системы - они будут в шоке
я уж молчу про афинную систему... :-d

[Сообщение изменено пользователем 25.07.2007 13:35]
0
От пользователя Биореактор
элегантно


От пользователя demiurg_ii

но не полно :-)
0
От пользователя Жeнeчкa
вовсе не факт, что

Цитата:
От пользователя: Тузя
наша красная точка находится в геометрической фигуре)


Если не находится, то условие


--------------------------------------------------------------------------------
Цитата:
От пользователя: Тузя

если в во всех 4х четвертях
--------------------------------------------------------------------------------

не выполняется.
0 / 1
От пользователя WSV
Даже если это будет не математически, а АЛГОРИТМИЧЕСКИ, то уже хорошо...


Нашел в старых исходниках:
-----------------------------8<-------------------------------

function InContur_Up_Down(B: TList; P: TVertex; DirY: Integer):boolean;
{находится ли точка внутри/на контуре при направлении луча вверх (DirY < 0),
вниз (DirY > 0)}
var One,Two,On,Done:boolean; //,Lower
Point1,Point2,Point3: TVertex;
OutP:TVertex;
TempP:TVertex;
I,Start,Sect,Limit: Integer;
T:byte;
R:TRect;
begin
try
Result:=False;
GetMaxRect(B, R);
I:= 0;
Sect:= 0;
Limit:= B.Count-1;
if Limit<1 then Exit;
{если точка попадает в прямоугольник контура}
if (InLimits(R.Left, R.Right, P.X) = 0) and
(InLimits(R.Top, R.Bottom, P.Y) = 0) then
begin
while TVertex(B[I]).X = P.X do I:= NextP(I, Limit, False);
Point1:= TVertex.Create(0,0);// New(PCoor,Init(0, 0));
Point2:= TVertex.Create(0,0);//New(PCoor,Init(0, 0));
Point3:= TVertex.Create(P.X, DirY);//New(PCoor,Init(P.X, DirY));
OutP:= TVertex.Create(0,0);//New(PCoor,Init(0, 0));
Start:= I;
repeat
One:= TVertex(B[I]).X < P.X;
Two:= not One;
On:= False;
repeat
TempP:= TVertex(B[I]);
I:= NextP(I, Limit, True);
Done:= I = Start;
if TVertex(B[I]).X = P.X then
On:= True
else
One:= TVertex(B[I]).X < P.X;
until (One = Two) or On or Done;
if (One = Two) or On then
if On then
begin
if ((TVertex(B[I]).Y < P.Y) and (DirY < 0))
or ((TVertex(B[I]).Y > P.Y) and (DirY > 0)) then
begin
repeat
I:= NextP(I, Limit, True);
Done:= I = Start;
Two:= TVertex(B[I]).X = P.X;
until not Two;
Two:= TVertex(B[I]).X < P.X;
if Two <> One then Inc(Sect);
end;
end
else
if ((TempP.Y < P.Y) and (DirY < 0)) or ((TempP.Y > P.Y) and (DirY > 0))
or ((TVertex(B[I]).Y < P.Y) and (DirY < 0)) or ((TVertex(B[I]).Y > P.Y) and (DirY > 0)) then
begin
Point1.X:=TempP.X; Point1.Y:=TempP.Y;// Assign(TempP.X, TempP.Y);
Point2.X:=TVertex(B[I]).X;Point2.Y:=TVertex(B[I]).Y;
if LineIntersect(Point1, Point2, P, Point3, T, OutP) then
if ((OutP.Y < P.Y) and (DirY < 0))
or ((OutP.Y > P.Y) and (DirY > 0)) then Inc(Sect);
end;
until Done;
OutP.Free;
Point3.Free;
Point2.Free;
Point1.Free;
Result:= (Sect mod 2) = 1;
end
else
Result:= False;
finally
end;
end;

function InContur(X,Y: Integer; B: TList): boolean;
var P: TVertex;
begin
try
P:=TVertex.Create(X,Y);
Result:=InContur_Up_Down(B, P,-15000) or InContur_Up_Down(B, P, 15000);
P.Free;
except
Result:=False;
end;
end;

-----------------------------8<-------------------------------
Работает вполне нормально, но за алгоритм прошу не пинать, мало ли что у мну в исходниках валяется
:-d
0
pesto™
От пользователя Жeнeчкa
Страх не справиться если ребенок подойдет вдруг с вопросом?

Именно.... :-)
0
_Cью_
От пользователя HappyMike.da.ru (снимаю свадьб...
Работает вполне нормально, но за алгоритм прошу не пинать, мало ли что у мну в исходниках валяется

а можно блок-схему? :-)
0
вообще у меня есть идеальное решение - свести задачу к задаче с самолетом и мухами, а дальше методом индукции - самолет взлетит - значит точка в фигуре, не взлетит - значит вне фигуры
1 / 0
От пользователя _Сью_
а можно блок-схему?

Дык, а чо там, проверяется пересечение сторон, да и все :-)
0
Знаю 2 способа

ПЕРВЫЙ
От пользователя demiurg_ii
Правильное направление мысли для ОДНОГО из способов -- дополнить до выпуклого многоугольника. Получится система из выпуклого многоугольника, внутри которого, на его сторонах висят произвольные многоугольники с МЕНЬШИМ числом сторон. Теперь задача выглядит так:
1. Проверить, что точка лежит внутри большого выпуклого многоугольника.
2. Проверить, что точка НЕ лежит внутри одного из меньших произвольных многоугольников. Рекурсивно.

Всё правильно:
1. Разбиваем на выпуклые многоугольники, самое простое - на треугольники. Это делается так:
а) Находим выпуклую вершину (с острым углом) с самым минимальным углом
б) "отрезаем" от многоугольника треугольник с этой выбранной вершиной и двумя соседними
в) продолжаем рекурсивно, пока в остатке не останется треугольник
2. Для каждого из треугольников переориентируем его, чтобы вершины шли в направлении часовой стрелки.
3. Искомая точка находится внутри треугольника, если она находится справа от каждого из трех векторов, проходящих через вершины (расположенные по часовой) треугольника. Можно и не переориентировать треугольник - тогда эта точка должна быть с одной и той же стороны от трех векторов

ВТОРОЙ СПОСОБ
Называется "Сканирующая линия" (или scanline)
1. Проводится в любой системе координат горизонтальная линия через исходную точку.
2. Считается количество пересечений слева от этой точки с гранями многоугольника. Пересечение с вершиной "снаружи" считается за два пересечения
3. Если количество пересечений слева будет нечетное - то вершина внутри многоугольника

[Сообщение изменено пользователем 25.07.2007 13:48]

[Сообщение изменено пользователем 25.07.2007 17:57]
0
[Сообщение изменено пользователем 25.07.2007 13:35][/quote]

От пользователя demiurg_ii
[Сообщение изменено пользователем 25.07.2007 13:35]


От пользователя Тузя
так как нет условия в каком порядке соединяются точки
то



все ваши рисунки как фигура обходит центр координат распадаются, так как не сказано в каком порядке соеденяются точки
0
Обсуждение этой темы закрыто модератором форума.