powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Попадает ли точка в область
23 сообщений из 23, страница 1 из 1
Попадает ли точка в область
    #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
Попадает ли точка в область
    #38638397
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из точки проводишь линию на бесконечность.
если линия границы области пересекает четное число раз (0 это четное число) - то снаружи,
если нечетное - то внутри
...
Рейтинг: 0 / 0
Попадает ли точка в область
    #38638404
MaksimusAzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizиз точки проводишь линию на бесконечность.
если линия границы области пересекает четное число раз (0 это четное число) - то снаружи,
если нечетное - то внутри

А в виде формулы как это будет???
Повторюсь с условием для х(икс) вроде понятно а вот для у(игрека) ну не врублюсь... Это нужно типа запрограммировать потом
...
Рейтинг: 0 / 0
Попадает ли точка в область
    #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
Попадает ли точка в область
    #38638420
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaksimusAzovy<=SQRT(1-x^2)
почти правильно. что будет для точки с x=2 ?
...
Рейтинг: 0 / 0
Попадает ли точка в область
    #38638461
MaksimusAz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TMaksimusAzovy<=SQRT(1-x^2)
почти правильно. что будет для точки с x=2 ?

ну не будет хорошо.. но для этого есть X<=0 X>=-1
...
Рейтинг: 0 / 0
Попадает ли точка в область
    #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
Попадает ли точка в область
    #38638503
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaksimusAzov,

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

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

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

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

А на кого учитесь? Надеюсь не на программиста? Просто что-то смежное? :)
...
Рейтинг: 0 / 0
Попадает ли точка в область
    #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
Попадает ли точка в область
    #38638519
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКАDebug.Print "-точка входит в треуг, если она делит -"
Debug.Print "-треуг на 3 части"
Save my mind....
...
Рейтинг: 0 / 0
Попадает ли точка в область
    #38638561
MaksimusAzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрMaksimusAzovпропущено...


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

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

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

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

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


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

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

Нууу... тогда стоит вспоминать математику. Это же азы :) Не положено программистам такие вопросы задавать (не в обиду ;) )
...
Рейтинг: 0 / 0
Попадает ли точка в область
    #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
Попадает ли точка в область
    #38638745
MaksimusAzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрMaksimusAzovпропущено...


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

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

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

2
через (0,0) граница проходит два раза так шо пересечений четное число.
...
Рейтинг: 0 / 0
Попадает ли точка в область
    #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
Попадает ли точка в область
    #38641575
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizчерез (0,0) граница проходит два раза так шо пересечений четное число.
Сколько она там проходит - это интересный вопрос, но вот ответ "два" конкретно удивляет. "Четыре" я бы ещё понял. Но это был намёк на ещё более интересный вопрос - предложение оценить таким алгоритмом расположение точек (0.5; 0) и (1.5; 0), используя для критерия линию в (минус бесконечность; 0).

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

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

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

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

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


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