- Saved searches
- Use saved searches to filter your results more quickly
- b0006/Point-in-polygon
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- Тест Python, если точка находится в прямоугольнике
- Русские Блоги
- [Python] Два метода, чтобы определить, находится ли одна точка внутри данного прямоугольника. Прямоугольник можно наклонить
- Описание
- Метод 1: вращаться
- анализировать
- Код
- Метод 2: Вилка
- анализировать
- Код
- Ссылаться на
- Русские Блоги
- [Python] Два метода, чтобы определить, находится ли одна точка внутри данного прямоугольника. Прямоугольник можно наклонить
- Описание
- Метод 1: вращаться
- анализировать
- Код
- Метод 2: Вилка
- анализировать
- Код
- Ссылаться на
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Определение принадлежности точки произвольному полигону по координатам
b0006/Point-in-polygon
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Принадлежность произвольной точки полигону
Определение принадлежности точки произвольному полигону по координатам
В вычислительной геометрии известна задача об определении принадлежности точки полигону. На плоскости даны полигон и точка. Требуется решить вопрос о принадлежности точки полигону.
Полигон может быть, как выпуклым, так и невыпуклым. Обычно предполагается, что полигон простой, т.е. без самопересечений, но задачу рассматривают и для непростых полигонов. В последнем случае разные способы определения принадлежности точки полигону могут привести к разным результатам. Различают алгоритмы без предварительной обработки и алгоритмы с предварительной обработкой, в ходе которой создаются некоторые структуры данных, позволяющие в дальнейшем быстрее отвечать на множество запросов о принадлежности точек одному и тому же полигону.
Вычисления и сравнения площадей треугольников заменяются вычислениями и сравнениями их удвоенных площадей. Тем самым исключается погрешность округления при программной реализации всего алгоритма, в целом.
В данном методе сначала находятся площади трёх треугольников, которые образует произвольная точка с каждой стороной треугольника.
Затем находится площадь самого полигона. Найденные площади сравниваются — если сумма трёх площадей равна площади всего полигона, то значит точка принадлежит полигону.
- ввод координат точки в виде кортежей вида (x, y);
- определить принадлежности точки полигону;
Тест Python, если точка находится в прямоугольнике
Я новичок в Python и все еще изучаю веревки, но я надеюсь, что кто-то с большим опытом может помочь мне.
Я пытаюсь написать скрипт на Python, который:
- создает четыре точки
- создает четыре прямоугольника
- проверьте, находится ли каждая точка в каком-либо из прямоугольников, затем запишите результаты в выходной файл.
Проблема включает в себя две структуры данных 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()
Русские Блоги
[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
Ссылаться на
Русские Блоги
[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