Принадлежит ли точка прямоугольнику питон

Тест Python, если точка находится в прямоугольнике

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

Я пытаюсь написать скрипт на Python, который:

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

Проблема включает в себя две структуры данных Point и Rectangle class. Я уже начал создавать классы Point и Rectangle. Класс Rectangle должен содержать соответствующие наборы данных, созданные из случайного метода случайного модуля. Как вы можете сказать из моих попыток, я как бы повсюду, но я использовал #comments, чтобы попытаться получить то, что я пытаюсь сделать.

У меня есть конкретные вопросы:
1) как мне заставить этот скрипт работать?
2) Какие переменные или функции мне не хватает, чтобы генерировать случайные прямоугольники и посмотреть, есть ли конкретные точки в этих прямоугольниках?

## 1. Declare the Point class class Point: def __init__(self,x = 0.0, y = 0.0): self.x = x self.y = y pass ## 2. Declare the Rectangle class class Rectangle: def __int__(self): ## A rectangle can be determined aby (minX, maxX) (minY, maxY) self.minX = self.minY = 0.0 self.maxX = self.maxY = 1.0 def contains(self, point): ## add code to check if a point is within a rectangle """Return true if a point is inside the rectangle.""" # Determine if a point is inside a given polygon or not # Polygon is a list of (x,y) pairs. This function # returns True or False. def point_in_poly(x,y,poly): n = len(poly) inside = False p1x,p1y = poly[0] for i in range(n+1): p2x,p2y = poly[i % n] if y > min(p1y,p2y): if y x2: rectangle.minX=x2 rectangle.maxX=x1 rects.append(rectangle) ## Develop codes to generate y values below ## make sure minY != maxY while(y1 == y2): y1 = random.random() if y1y2: recetangle.minY=y2 racetangle.maxY=y1 ## add to the list rects.append(rectangle) ## 5. Add code to check which point is in which rectangle resultList = [] ## And use a list to keep the results for i in range(4): for j in range(4): if points[i] in rectangle[j]: print i # write the results to file f=open('Code5_4_1_Results.txt','w') for result in resultList: f.write(result+'\n') f.close() 

Источник

Читайте также:  Create maven java project intellij

Русские Блоги

[Python] Два метода, чтобы определить, находится ли одна точка внутри данного прямоугольника. Прямоугольник можно наклонить

Описание

В двухмерной системе координат все значения имеют двойной тип, затем прямоугольник может быть представлен четырьмя точками (x1, Y1) в качестве левого, (x2, y2) в качестве верхней точки (x3, y3 y3 )) Нижняя точка, (x4, y4) является правой точкой.
Дайте 4 балла, представляющие прямоугольник, и дайте другую точку (x, y), чтобы определить, находится ли (x, y) в прямоугольной

Метод 1: вращаться

анализировать

  • Матрица параллельна оси координат: непосредственно судья (x, y) и размер верхней части левого и верхнего справа от матрицы.
  • Матрица наклона: поверните прямоугольник наклона так, чтобы он параллельно по оси координат

Код

import math # 1 прямоугольная параллель координатной оси def isInMatrix(x1,y1,x2,y2,x,y): if xx1 or x>=x2 or yy1 or y>=y2: return False return True # 2 прямоугольник - это общий прямоугольник, который можно повернуть def isInSide(x1,y1,x2,y2,x3,y3,x4,y4,x,y): if y1==y2: return isInMatrix(x1,y1,x4,y4,x,y) l,k,s=y4-y3,x4-x3,math.sqrt((x4-x3)**2+(y4-y3)**2) cos,sin=l/s,k/s x1r,y1r=x1*cos+y1*sin,y1*cos-x1*sin x4r,y4r=x4*cos+y4*sin,y4*cos-x4*sin xr,yr=x*cos+y*sin,y*cos-x*sin return isInMatrix(x1r,y1r,x4r,y4r,xr,yr) 

Метод 2: Вилка

анализировать

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

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

Код

# (X1, y1) (x, y), (x2, y2) (x, y) векторная вилка def GetCross(x1,y1,x2,y2,x,y): a=(x2-x1,y2-y1) b=(x-x1,y-y1) return a[0]*b[1]-a[1]*b[0] # Судить (x, y), находится ли он внутри прямоугольника def isInSide(x1,y1,x2,y2,x3,y3,x4,y4,x,y): return GetCross(x1,y1,x2,y2,x,y)*GetCross(x3,y3,x4,y4,x,y)>=0 and GetCross(x2,y2,x3,y3,x,y)*GetCross(x4,y4,x1,y1,x,y)>=0 

Ссылаться на

Источник

Проверка на вхождение точки в прямоугольник

Есть координатная плоскость. Заданы 10 координат: x, y — координаты точки; x1,x2,x3,x4,y1,y2,y3,y4 — координаты точек, задающих прямоугольник.
Нужно проверить, входит ли точка в этот прямоугольник. Как это можно реализовать?

Вхождение точки в прямоугольник
Здравствуйте, нужна помощь в решении такой задачи: В декартовой системе координат прямоугольник.

Вхождение квадрата на прямоугольник
Люди как мне сделать функцию(shapebox1, shapebox2) для проверки входит ли один квадрат в другой.

Вхождение точки в область
Определить, попадает ли точка с координатами (X,Y) в заданную область. Код: #include.

Вхождение точки в невыпуклый многоугольник
Здравствуйте ! Есть невыпуклый многоугольник (координаты вершин известны) и есть точка.

Определить вхождение точки в промежуток
Подскажите что надо изменить в коде, чтоб он выдавал список полученных значений Program aser; var.

Эксперт Python

Стороны прямоугольника не обязательно строго горизонтальны и вертикальны?
Но всё равно у вас данные избыточные, это для четырёхугольника.

Эксперт NIX

Насколько я помню геометрию можно попробовать решить так: провести через проверяемую точку прямые, параллельные сторонам прямоугольника. т.е. в уравнениях описывающих прямые коэффициенты равны (признак паралельности), а . И аналогично для двух других сторон.

Вхождение точки в график функции
Никак не могу решить эту задачу с определением вхождения точки в график функции. Выводится не.

Вхождение точки в заштрихованную облость
Добрый день. задача из степика. не могу найти свою ошибку. вот мой код: a — верхний левый квадрат.

Проверка на вхождение в коллекцию
foreach (DataRow row in table.Rows) < if.

Проверка на вхождение в диапазон
Здравствуйте, помогите решить задачу. Нужно сделать базу данных IP адрессов (сделать свой формат).

Построчная проверка на вхождение
Здравствуйте уважаемые форумчане! Получаю посредством CMD список ранее подключаемых сетей и передаю.

Проверка на вхождение в диапазон
Здравствуйте! Есть значение (допустим в label чекбокса): 10000-20000; Есть продукт со стоимостью.

Источник

Реализации алгоритмов/Задача о принадлежности точки многоугольнику

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

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

Алгоритм определяет точки границ многоугольника как точки, ему принадлежащие.

Описание [ править ]

Для того чтобы все результаты вычислений в программе могли быть представлены целочисленными переменными (манипулирование данными целого типа повышает быстродействие программы и является естественным для приложений компьютерной графики), вычисления и сравнения площадей треугольников заменяются вычислениями и сравнениями их удвоенных площадей. Тем самым исключается погрешность округления при программной реализации всего алгоритма, в целом.

Аргументами функции, реализующей проверку принадлежности данной точки данному многоугольнику произвольного вида, являются

  • указатель на массив пар целочисленных координат вершин многоугольника, а именно, на массив структур вида
  • число вершин многоугольника;
  • целочисленное значение координаты X заданной точки;
  • целочисленное значение координаты Y заданной точки.

Функция возвращает 1, если точка принадлежит многоугольнику, иначе — 0.

Функция имеет следующий вид.

int IsPointInsidePolygon (Point *p, int Number, int x, int y) < int i1, i2, n, N, S, S1, S2, S3, flag; N = Number; for (n=0; n= N) i2 = 0; if (i2 == (n < N-1 ? n + 1 : 0)) break; S = abs (p[i1].x * (p[i2].y - p[n ].y) + p[i2].x * (p[n ].y - p[i1].y) + p[n].x * (p[i1].y - p[i2].y)); S1 = abs (p[i1].x * (p[i2].y - y) + p[i2].x * (y - p[i1].y) + x * (p[i1].y - p[i2].y)); S2 = abs (p[n ].x * (p[i2].y - y) + p[i2].x * (y - p[n ].y) + x * (p[n ].y - p[i2].y)); S3 = abs (p[i1].x * (p[n ].y - y) + p[n ].x * (y - p[i1].y) + x * (p[i1].y - p[n ].y)); if (S == S1 + S2 + S3) < flag = 1; break; >i1 = i1 + 1; if (i1 >= N) i1 = 0; break; > if (flag == 0) break; > return flag; >

Очень быстрый алгоритм [ править ]

В основе алгоритма лежит идея подсчёта количества пересечений луча, исходящего из данной точки в направлении горизонтальной оси, со сторонами многоугольника. Если оно чётное, точка не принадлежит многоугольнику. В данном алгоритме луч направлен влево.

bool pnpoly(int npol, float * xp, float * yp, float x, float y) < bool c = false; for (int i = 0, j = npol - 1; i < npol; j = i++) < if ((((yp[i] ((xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i])))) c = !c; > return c; >

Замечание: Так как умножение быстрее деления, условие можно записать так:

int pnpoly(int npol, float * xp, float * yp, float x, float y) < int c = 0; for (int i = 0, j = npol - 1; i < npol; j = i++) < if (( (yp[i] < yp[j]) && (yp[i] (xp[j] - xp[i]) * (y - yp[i])) ) || ( (yp[i] > yp[j]) && (yp[j] return c; >

Однако, стоит заметить, что данный алгоритм не эквивалентен предыдущему, поэтому его использование может привести к неправильным результатам.

Perl [ править ]

my $x = -40; my $y = -60; # Проверяемая точка my @xp = (-73,-33,7,-33); # Массив X-координат полигона my @yp = (-85,-126,-85,-45); # Массив Y-координат полигона &InPoly(\@xp,\@yp,$x,$y); sub InPoly() < my($xp, $yp, $x, $y) = @_; my $npol = @; my $j = $npol - 1; my $c = 0; for(my $i = 0; $i < $npol;$i++) < if ((((@[$i]<=$y) && ($y<@[$j])) || ((@[$j]<=$y) && ($y<@[$i]))) && ($x > (@[$j] - @[$i]) * ($y - @[$i]) / (@[$j] - @[$i]) + @[$i])) < $c = !$c >$j = $i; > return $c; >

Delphi (Object Pascal) [ править ]

type tPolygon = array of tPoint; //tPoint - это запись, с двумя полями, x и y . function IsMouseInPoly(x,y: integer; myP: tPolygon): boolean; //x и y - это координаты мыши var //myP - массив с вершинами полигона i,j,npol: integer; inPoly: boolean; begin npol:=length(myP)-1; j:=npol; inPoly:=false; for i:=0 to npol do begin if ((((myP[i].y<=y) and (y(myP[j].x-myP[i].x)*(y-myP[i].y) / (myP[j].y-myP[i].y)+myP[i].x)) then inPoly:=not inPoly; j:=i; end; result:=inPoly; end;

JavaScript [ править ]

var x = -40; var y = -60; var xp = new Array(-73,-33,7,-33); // Массив X-координат полигона var yp = new Array(-85,-126,-85,-45); // Массив Y-координат полигона function inPoly(x,y) < var npol = xp.length; var j = npol - 1; var c = 0; for (var i = 0; i < npol;i++)< if ((((yp[i]<=y) && (y(xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i])) < c = !c >j = i; > return c; > inPoly(x,y);

Python 3 [ править ]

На Python программа несколько отличается от других языков в сторону компактности из-за особенностей адресации элементов массива. Не нужны дополнительные переменные. Не работает с многоугольниками вогнутого типа.

def inPolygon(x, y, xp, yp): c=0 for i in range(len(xp)): if (((yp[i] (xp[i-1] - xp[i]) * (y - yp[i]) / (yp[i-1] - yp[i]) + xp[i])): c = 1 - c return c print( inPolygon(100, 0, (-100, 100, 100, -100), (100, 100, -100, -100)))

Быстрый алгоритм для случая, когда луч пересекает одну или несколько вершин [ править ]

Функция Cross определяет, пересекает ли луч j-ое ребро многоугольника:

bool Cross(int j) < int first = j; int second = j == n - 1 ? 0 : j + 1; double y = (xh - points[first].x) * (points[second].y - points[first].y) / (points[second].x - points[first].x) + points[first].y; double minimal = min(points[first].x, points[second].x); double maximal = max(points[first].x, points[second].x); return (points[first].x != points[second].x) && (yh >= y) && (xh > minimal) && (xh

Фрагмент основной программы:

. int count = 0; for (int i = 0; i < n; i++) < count += Cross(i); >.

Если переменная count примет нечетное значение, то точка лежит внутри многоугольника. В противном случает точка лежит вне заданого многоугольника.

Замечание: В данной реализации алгоритма луч направлен вниз.

Источник

Оцените статью