qwertyquerty / collision Goto Github PK
View Code? Open in Web Editor NEWCollision is a python library meant for collision detection between convex and concave polygons, circles, and points.
License: MIT License
Collision is a python library meant for collision detection between convex and concave polygons, circles, and points.
License: MIT License
Hi I want to seperate overlapping polygons. I have convex hulls of different masks on the same image. Some of the polygons are overlapping. I want to minimize those polygons so they now dont overlap at all. My idea is to find an intersection line as shown in the image below. Is this possible? How to do it?
I want to move or reduce them just as much as the intersection line could be each polygon's one sided boundary
I believe, there is an issue in the collision recognition. Example:
`import pygame as pg
import sys
import os
from collision import *
SCREENSIZE = (1200,900)
screen = pg.display.set_mode(SCREENSIZE, pg.DOUBLEBUF|pg.HWACCEL)
v = Vector
p0 = Concave_Poly(v(0,0), [])
p0.set_points([
Vector(697.1654965313376, 179.9115879140274),
Vector(764.9587442373818, 222.3859986276198),
Vector(743.3817435948768, 256.82496846229026),
Vector(675.5884958888325, 214.35055774869784),
])
p1 = Concave_Poly(v(0,0), [])
p1.set_points([
Vector(875.0138897016246, 123.17802988652383),
Vector(943.1811884599225, 165.04949248334466),
Vector(949.304599935167, 170.46229454571227),
Vector(1019.8568670514846, 271.73421253085047),
Vector(1040.1360798659869, 381.7005038144338),
Vector(1020.1348828367004, 479.85313011280556),
Vector(974.5176923937827, 555.6645122896266),
Vector(939.825961238999, 534.4962957968701),
Vector(980.5408637494689, 470.69216659798064),
Vector(999.8705586307079, 387.20481118696586),
Vector(985.0376168510401, 292.6920133572453),
Vector(927.0230429423466, 204.44967187871185),
Vector(921.9104854607375, 199.67848025255998),
Vector(853.7431867024396, 157.80701765573914),
])
clock = pg.time.Clock()
stop = False
cont = False
while 1:
for event in pg.event.get():
if event.type == pg.QUIT:
sys.exit()
pressed = pg.key.get_pressed()
# Hit SPACE to continue after the error
if pressed[pg.K_SPACE]: cont = True
screen.fill((0,0,0))
if not stop or cont: p0.pos.x += 0.1
p0c, p1c, p2c = (0,255,255),(0,255,255),(0,255,255)
p0bc = (255,255,255)
p1bc = (255,255,255)
if collide(p0,p1):
p1c = (255,0,0); p0c = (255,0,0);
stop = True
if test_aabb(p0.aabb,p1.aabb): p1bc = (255,0,0); p0bc = (255,0,0);
pg.draw.polygon(screen, p0c, p0.points, 3)
pg.draw.polygon(screen, p1c, p1.points, 3)
pg.draw.polygon(screen, p0bc, (p0.aabb[0],p0.aabb[1],p0.aabb[3],p0.aabb[2]), 3)
pg.draw.polygon(screen, p1bc, (p1.aabb[0],p1.aabb[1],p1.aabb[3],p1.aabb[2]), 3)
pg.display.flip()
clock.tick(100)
`
When I collide 2 polygons and check the response for the overlap the response is not modified. I have attached a short piece of code to show what I mean.
from collision import *
from collision import Vector as v
p1 = Concave_Poly(v(0,0), [v(0,0), v(10,10), v(10,0)])
p2 = Concave_Poly(v(0,0), [v(0,0), v(0,5), v(5,5), v(5,0)])
r = Response()
r.reset()
c = collide(p1, p2, response = r)
if c:
print(r)
The two polygons clearly overlap but the response is:
Response [
a = None
b = None
overlap = inf
overlap_n = Vector [0, 0]
overlap_v = Vector [0, 0]
a_in_b = True
b_in_a = True
]
I'm running this with Python 3.9.1
I tried using this library with Python 2.7 (installed via pip) but had no success.
import collision
yields the following error:
File "/home/stangier/.local/lib/python2.7/site-packages/collision/__init__.py", line 8, in <module>
from .circle import Circle
File "/home/stangier/.local/lib/python2.7/site-packages/collision/circle.py", line 3, in <module>
from . import poly
File "/home/stangier/.local/lib/python2.7/site-packages/collision/poly.py", line 3, in <module>
from .util import Vector
File "/home/stangier/.local/lib/python2.7/site-packages/collision/util.py", line 19
def __add__(self, other: Any):
I suppose this raises an error because this library uses Python type hints, which were introduced in version 3.5. I don't expect you to port this library to Python 2.7 because it's outdated (although it would be nice to have), but it would be great if you could change you PyPi entry accordingly and remove it from the Python 2.7 pip repository.
The return type of points is "list of Vector2".
Has this a reason? Isn't better to return "list of Vector" (eg Vector2 has no copy() method)?
Somehow this breaks the architecture... For example I cannot (easily) construct a new Poly out of existing Poly.points.
I also miss the possibility to construct Vector as Vector(Vector).
Regards
Gogo
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.