Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Попадает ли точка в область / 23 сообщений из 23, страница 1 из 1
12.05.2014, 10:23
    #38638391
MaksimusAzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
Дается ответ “попал”, если координаты вводимой точки X,Y попадают в заштрихованную область (области); в противном случае дается ответ “мимо”

для окружности с условием определился
x>=0
x<=1
y>=-1
y<0
y<=SQRT(1-x^2)
а вот для части которая под прямой туплю т.е. X<=0 X>=-1 Y>=0 Y<=1 y=... (здесь условие что бы проверить что точка попала под прямую) но вот какое...
...
Рейтинг: 0 / 0
12.05.2014, 10:26
    #38638397
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
из точки проводишь линию на бесконечность.
если линия границы области пересекает четное число раз (0 это четное число) - то снаружи,
если нечетное - то внутри
...
Рейтинг: 0 / 0
12.05.2014, 10:32
    #38638404
MaksimusAzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
tchingizиз точки проводишь линию на бесконечность.
если линия границы области пересекает четное число раз (0 это четное число) - то снаружи,
если нечетное - то внутри

А в виде формулы как это будет???
Повторюсь с условием для х(икс) вроде понятно а вот для у(игрека) ну не врублюсь... Это нужно типа запрограммировать потом
...
Рейтинг: 0 / 0
12.05.2014, 10:37
    #38638411
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
MaksimusAzovа вот для части которая под прямой туплю т.е. X<=0 X>=-1 Y>=0 Y<=1 y=... (здесь условие что бы проверить что точка попала под прямую) но вот какое...
Все так примитивно что неохота даже подсказывать.

Используй метод научного тыка: наделай точек под условие X<=0 X>=-1 Y>=0 Y<=1, смотри значения X, Y ... думаю дальше озарение случится :)
...
Рейтинг: 0 / 0
12.05.2014, 10:43
    #38638420
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
MaksimusAzovy<=SQRT(1-x^2)
почти правильно. что будет для точки с x=2 ?
...
Рейтинг: 0 / 0
12.05.2014, 11:10
    #38638461
MaksimusAz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
Dima TMaksimusAzovy<=SQRT(1-x^2)
почти правильно. что будет для точки с x=2 ?

ну не будет хорошо.. но для этого есть X<=0 X>=-1
...
Рейтинг: 0 / 0
12.05.2014, 11:11
    #38638470
MaksimusAzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
Dima TMaksimusAzovа вот для части которая под прямой туплю т.е. X<=0 X>=-1 Y>=0 Y<=1 y=... (здесь условие что бы проверить что точка попала под прямую) но вот какое...
Все так примитивно что неохота даже подсказывать.

Используй метод научного тыка: наделай точек под условие X<=0 X>=-1 Y>=0 Y<=1, смотри значения X, Y ... думаю дальше озарение случится :)

Да понятно, что примитивно однако эту математику с геометрию уже давно подзабыл(конкретно)...
...
Рейтинг: 0 / 0
12.05.2014, 11:35
    #38638503
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
MaksimusAzov,

на рисунке все формулы представлены уже...
1 случай, это попали в треугольник: (x принадлежит [-1; 0]) и (y принадлежит [0; -x])
2 случай попали в окружность справа-внизу: x^2+y^2<=1, x>0, y<0
3 случай - не попали. Выполняется, если не выполнились условия предыдущих двух случаев
...
Рейтинг: 0 / 0
12.05.2014, 11:35
    #38638504
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
tchingizиз точки проводишь линию на бесконечность.
если линия границы области пересекает четное число раз (0 это четное число) - то снаружи,
если нечетное - то внутри
Будьте добры на рисунке провести линию из точки (1;1) в точку (минус бесконечность; минус бесконечность)
...
Рейтинг: 0 / 0
12.05.2014, 11:37
    #38638512
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
MaksimusAzovDima Tпропущено...

Все так примитивно что неохота даже подсказывать.

Используй метод научного тыка: наделай точек под условие X<=0 X>=-1 Y>=0 Y<=1, смотри значения X, Y ... думаю дальше озарение случится :)

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

А на кого учитесь? Надеюсь не на программиста? Просто что-то смежное? :)
...
Рейтинг: 0 / 0
12.05.2014, 11:39
    #38638515
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
MaksimusAzov,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Function s_treug(x1, y1, x2, y2, x, y)
''площадь треуугольника по трем вершинам ------интернет
s_treug = Abs(((x1 - x) * (y2 - y) - (x2 - x) * (y1 - y))) / 2
Debug.Print s_treug
End Function
Sub treug12()
Dim x, y, x1, x2, x3, y1, y2, y3
Dim s0, s1, s2, s3
Debug.Print "---вхождение точки в треугольник---------"
Debug.Print "-точка входит в треуг, если она делит   -"
Debug.Print "-треуг на 3 части и их суммарная площадь-"
Debug.Print "-почти равна площади исходного треуг-----"
Debug.Print "--"

x = -1
y = 1


Debug.Print "x="; x; " y="; y

x1 = 0: y1 = 0
x2 = -1: y2 = 0
x3 = -1: y3 = 1
s0 = s_treug(x1, y1, x2, y2, x3, y3)
s1 = s_treug(x1, y1, x2, y2, x, y)
s2 = s_treug(x1, y1, x3, y3, x, y)
s3 = s_treug(x2, y2, x3, y3, x, y)
If Abs(s0 - s1 - s2 - s3) < 0.001 Then
Debug.Print "ok---в треуг"
Else
Debug.Print "-----вне треуг"

End If

End Sub
...
Рейтинг: 0 / 0
12.05.2014, 11:41
    #38638519
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
ПЕНСИОНЕРКАDebug.Print "-точка входит в треуг, если она делит -"
Debug.Print "-треуг на 3 части"
Save my mind....
...
Рейтинг: 0 / 0
12.05.2014, 12:05
    #38638561
MaksimusAzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
ПрограмёрMaksimusAzovпропущено...


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

А на кого учитесь? Надеюсь не на программиста? Просто что-то смежное? :)

))) Да уж лет 5 назад как отучился на... программиста... )))
...
Рейтинг: 0 / 0
12.05.2014, 12:08
    #38638565
MaksimusAzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
ПрограмёрMaksimusAzov,

на рисунке все формулы представлены уже...
1 случай, это попали в треугольник: (x принадлежит [-1; 0]) и (y принадлежит [0; -x])
2 случай попали в окружность справа-внизу: x^2+y^2<=1, x>0, y<0
3 случай - не попали. Выполняется, если не выполнились условия предыдущих двух случаев

Спасибо огромное...
...
Рейтинг: 0 / 0
12.05.2014, 13:18
    #38638670
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
MaksimusAzovПрограмёрпропущено...


А на кого учитесь? Надеюсь не на программиста? Просто что-то смежное? :)

))) Да уж лет 5 назад как отучился на... программиста... )))

Нууу... тогда стоит вспоминать математику. Это же азы :) Не положено программистам такие вопросы задавать (не в обиду ;) )
...
Рейтинг: 0 / 0
12.05.2014, 13:22
    #38638674
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
MaksimusAzovПрограмёрMaksimusAzov,

на рисунке все формулы представлены уже...
1 случай, это попали в треугольник: (x принадлежит [-1; 0]) и (y принадлежит [0; -x])
2 случай попали в окружность справа-внизу: x^2+y^2<=1, x>0, y<0
3 случай - не попали. Выполняется, если не выполнились условия предыдущих двух случаев

Спасибо огромное...

И ещё... один fix... во втором случае x>0, y<0 стоит заменить на x>=0, y<=0. Я везде писал с учётом, что точка лежит в закрашенной области даже тогда, когда лежит на её краю (линии), а тут что-то провтыкнул :)
...
Рейтинг: 0 / 0
12.05.2014, 14:07
    #38638745
MaksimusAzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
ПрограмёрMaksimusAzovпропущено...


))) Да уж лет 5 назад как отучился на... программиста... )))

Нууу... тогда стоит вспоминать математику. Это же азы :) Не положено программистам такие вопросы задавать (не в обиду ;) )

Да обид нет, просто знакомые попросили вот и возник вопрос, знания они ведь забываются, если ими не пользоваться, а я уж лет 10 таким не пользовался...
...
Рейтинг: 0 / 0
14.05.2014, 22:05
    #38641554
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
softwarertchingizиз точки проводишь линию на бесконечность.
если линия границы области пересекает четное число раз (0 это четное число) - то снаружи,
если нечетное - то внутри
Будьте добры на рисунке провести линию из точки (1;1) в точку (минус бесконечность; минус бесконечность)
1
сорри, надо добавить условия.
(видимо фигура должна быть выпуклая. Значит надо разделить на выпуклые)

2
через (0,0) граница проходит два раза так шо пересечений четное число.
...
Рейтинг: 0 / 0
14.05.2014, 22:13
    #38641563
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
MaksimusAzovtchingizиз точки проводишь линию на бесконечность.
если линия границы области пересекает четное число раз (0 это четное число) - то снаружи,
если нечетное - то внутри

А в виде формулы как это будет???
Повторюсь с условием для х(икс) вроде понятно а вот для у(игрека) ну не врублюсь... Это нужно типа запрограммировать потом
в виде формулы на сишарпе


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
#pragma warning disable 219
#define DEBUG


using System;
using System.Timers; 

using System.Data;
using System.Drawing;
using System.Windows.Forms; 
using System.Collections; 
using System.Collections.Specialized;
using System.Collections.Generic;

using System.Text.RegularExpressions; 
using System.IO;
using System.Threading;
using System.Globalization;

namespace ut
{
 public class geo    /// функции для работы с графикой


 {
                // see http://base.vingrad.ru/search.php?q=classify&x=17&y=8
   const string _nm = "geo";
   public enum   Position   { Left, Right, Ahead, Behind, Between, Begin, End };
   public enum   Edge   { Touching, Crossing, Inessential };
   public const double notLess  = 8.0;    /// to work less

   static public double len(Point a){    /// длина отрезка
     double  x= (double)a.X;
     double  y= (double)a.Y;
     return Math.Sqrt(x*x + y*y) ;
   } 

   static public double len(Point a, Point b){     /// длина отрезка
     return len ( new Point  (b.X - a.X, b.Y - a.Y) );
   } 

   static Point halfWay (Point a, Point b) {        /// точка на середине отрезка
     return new Point ((a.X + b.X)/2, (a.Y + b.Y)/2);
   }

   static Point stepLess (Point a, Point b, double step) {  /// маленький шаг от a к b
     Point ret = new Point ( b.X,  b.Y);
     while (step > notLess && len (a, ret ) > step)
        ret = halfWay(a, ret);
     return ret;
   }


               //http://algolist.manual.ru/maths/geom/datastruct.php
   static public Position classify(Point origin, Point bgn, Point end){ /// расположение точки относительно отрезка
     const string _me = _nm+"::classify";


     Point a = new Point (end.X - bgn.X, end.Y-bgn.Y);
     Point b = new Point (origin.X - bgn.X, origin.Y-bgn.Y);

     double sa = 1.0*a.X *b.Y - 1.0*b.X*a.Y;

#if DEBUG1
     gVars.lfl.wrLn ("{0}: origin/bgn/eng: {1}:{2}/{3}:{4}/{5}:{6} \n", _me,  
                                           origin.X, origin.Y,  
                                                    bgn.X, bgn.Y,
                                                           end.X, end.Y );
     gVars.lfl.wrLn ("{0}: a/b/sa: {1}:{2}/{3}:{4}/{5} \n", _me,  
                                a.X, a.Y,  
                                        b.X, b.Y,   sa);
#endif

     if (sa >  0.0) return   Position.Left;
     if (sa <  0.0) return   Position.Right;
     if ((a.X*b.X<0)||(a.Y*b.Y<0)) return  Position.Behind;
     if (geo.len(a) < geo.len(b))  return  Position.Ahead;
     if (origin.X == bgn.X && origin.Y == bgn.Y) return Position.Begin;
     if (origin.X == end.X && origin.Y == end.Y) return Position.End;
     return Position.Between;
   }


   static public Edge edgeType(Point a, Point v, Point w){
     const string _me = _nm+"::IsPointInside";
     Edge ret = Edge.Inessential;
     Position pos;
     switch (pos = classify(a, v, w)) {
      case Position.Left : ret =  ((v.Y < a.Y)&&(a.Y<=w.Y))?Edge.Crossing:Edge.Inessential ; break;
      case Position.Right: ret =  ((w.Y < a.Y)&&(a.Y<=v.Y))?Edge.Crossing:Edge.Inessential ; break;
      case Position.Begin: 
      case Position.End: 
      case Position.Between: 
                          ret =  Edge.Touching; break;
     }
     gVars.lfl.wrLn ("{0}: point: {1}:{2}; ret/pos: {3}/{4} \n", _me,  a.X, a.Y, ret, pos);

     return ret;
   }

   static public   bool IsPointInside (List<Point> plgn, Point pnt ) {
     const string _me = _nm+"::IsPointInside";
     int parity = 0;
     bool ret = false;
     gVars.lfl.wrLn ("{0}: point: {1}:{2} \n", _me,  pnt.X, pnt.Y);
     if ( plgn != null &&  plgn.Count>2) {
       Point bgn;
       Point end;
       for ( int i = 0; i < plgn.Count; i++){
         bgn = plgn[i];
         if (i+1 >= plgn.Count) {
           end = plgn[0];
         }
         else
           end = plgn[i+1];
         gVars.lfl.wrLn ("{0}: {1}th edge: {2}:{3}/{4}:{5}; parity {6} \n", _me, 
                                i, bgn.X, bgn.Y, end.X, end.Y, parity);
         switch(edgeType(pnt, bgn, end)){
           case Edge.Touching: return true;
           case Edge.Crossing: parity = 1 - parity; break;
         }
       }
       gVars.lfl.wrLn ("{0}: parity: {1} \n", _me,  parity);
       if (parity!=0)
         ret = true;
     }
     else {
       ; // not polygon but dot or segment.  check in another way
     }
     return ret;
   }
 
  static public   int  GetInnerVertex (List<Point> plgn) { /// взять первую внутреннюю вершину
     int rc = -1;
     const string _me = _nm+"::GetInnerConvex";
     if ( plgn != null & plgn.Count > 3){
       int l, r;
       double   minLen = (double) Math.Max(gVars.polygon.maxX, gVars.polygon.maxY);
       for (int i = 0; i < plgn.Count; i++)    // to find smallest distance
         for (int j = 0; j < plgn.Count; j++) { //  between any two vertexes
           if (i !=j ){
             minLen = Math.Min(minLen, len(plgn[i], plgn[j]));
#if DEBUG
             gVars.lfl.wrLn ("{0}: i/j/minL: {1}/{2}/'{3}' \n", _me, i, j, minLen); 
#endif
           }
         }
       gVars.lfl.wrLn ("{0}: minL: '{1}' \n", _me, minLen); 


       Point dot;//, dotL, dotR ;
       for (rc = 0; rc < plgn.Count; rc++){
         l = (rc+plgn.Count-1)%plgn.Count;
         r = (rc+plgn.Count+1)%plgn.Count;
         gVars.lfl.wrLn ("{0}: i/l/r/Count: {1}/{2}/{3}/{4} \n", _me,  rc, l, r, plgn.Count);
         dot = halfWay (plgn[l], plgn[r]) ;                           // to make one step in any case
         gVars.lfl.wrLn ("{0}: big vertex/dot: {1}:{2}/{3}:{4} \n", _me,  
                                            plgn[rc].X, plgn[rc].Y,
                                                    dot.X, dot.Y );
         dot =  stepLess (plgn[rc], dot, minLen/2);                   // небольшой сдвиг от вершины
                                                                      
         gVars.lfl.wrLn ("{0}: big vertex/dot2: {1}:{2}/{3}:{4} \n", _me,  
                                            plgn[rc].X, plgn[rc].Y,
                                                    dot.X, dot.Y );

         if (IsPointInside(plgn, dot)==false)                         
           return rc;
       }
       rc = -1;
     }
     return rc;
   }


   static public  List<Point>  RemoveInnerVertex (List<Point> plgn) { /// удаление внутренней вершины
     const string _me = _nm+"::ToConvex";
     int idx=0;
     if ( plgn != null && plgn.Count > 3 ){
       idx =  GetInnerVertex (plgn);
       if (idx >=0 ) {
         plgn.Remove (plgn[idx]);                                   // образ на экране
         gVars.polygon.Remove(gVars.polygon[idx]);                  // исходные точки для вывода в xml
       }
     }
     return plgn; 
   }

   static public  List<Point>  ToConvex (List<Point> plgn) {       /// удаление всех внутренних вершин
     const string _me = _nm+"::ToConvex";
     int idx=0;
     while ( plgn != null && plgn.Count > 3 ){
       idx =  GetInnerVertex (plgn);
       if (idx <0 ) break;
       plgn.Remove (plgn[idx]);
       gVars.polygon.Remove(gVars.polygon[idx]);
     }
     return plgn; 
   }

}}




метод IsPointInside

алгоритм с // http://algolist.manual.ru/maths/geom/datastruct.php
...
Рейтинг: 0 / 0
14.05.2014, 22:27
    #38641575
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
tchingizчерез (0,0) граница проходит два раза так шо пересечений четное число.
Сколько она там проходит - это интересный вопрос, но вот ответ "два" конкретно удивляет. "Четыре" я бы ещё понял. Но это был намёк на ещё более интересный вопрос - предложение оценить таким алгоритмом расположение точек (0.5; 0) и (1.5; 0), используя для критерия линию в (минус бесконечность; 0).

П.С. Если уж говорить о выпуклых, проще сразу сказать "алгоритм Сайруса-Бека". Кстати, мне так помнится, что при небольшой доработке он обобщается и на невыпуклые.
...
Рейтинг: 0 / 0
14.05.2014, 22:29
    #38641577
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
tchingizsoftwarerпропущено...

Будьте добры на рисунке провести линию из точки (1;1) в точку (минус бесконечность; минус бесконечность)
1
сорри, надо добавить условия.
(видимо фигура должна быть выпуклая. Значит надо разделить на выпуклые)

не должно быть самопересечений
...
Рейтинг: 0 / 0
14.05.2014, 22:35
    #38641581
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
softwarertchingizчерез (0,0) граница проходит два раза так шо пересечений четное число.
Сколько она там проходит - это интересный вопрос, но вот ответ "два" конкретно удивляет. "Четыре" я бы ещё понял.

однозначно два

softwarer Но это был намёк на ещё более интересный вопрос - предложение оценить таким алгоритмом расположение точек (0.5; 0) и (1.5; 0), используя для критерия линию в (минус бесконечность; 0).
.
да, видимо,
надо оговориться о внутренних точках
...
Рейтинг: 0 / 0
14.05.2014, 22:57
    #38641598
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попадает ли точка в область
tchingizоднозначно два
Интересно было бы поподробнее. Причём имея в виду, что считать ответ будет алгоритм. Лично мне (по-человечески) ближе всего ответ "три" :)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Попадает ли точка в область / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]