Metadata-Version: 2.4
Name: polygon_math
Version: 1.3.2
Summary: Calculate geometric properties of arbitrary 2D polygons
Home-page: https://github.com/gerritnowald/polygon
Author: Gerrit Nowald
Author-email: gerrit.nowald@gmail.com
Project-URL: Bug Tracker, https://github.com/gerritnowald/polygon/issues
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6.15
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy>=1.15.0
Requires-Dist: matplotlib>=2.0.0
Dynamic: license-file

# polygon
Python module to calculate geometric properties of arbitrary 2D polygons:
- area, centroid (center of mass)
- second moment of area (bending stiffness of beams)
- triangles: incircle and circumscribed (outer) circle
- solid of revolution: volume, surface areas, center of mass
- check if point is inside or on edge of polygon
- move, rotate and scale polygon
- plotting with matplotlib arguments (e.g. color, linestyle, label)

![](https://github.com/gerritnowald/polygon/blob/main/examples/examples.png)

## examples:
https://github.com/gerritnowald/polygon/blob/main/examples/examples.ipynb

## installation:
```
pip install polygon-math
```

### creating a polygon object:
```
from polygon_math import polygon
Vertices = [[x0,y0],[x1,y1],[x2,y2],...]   # 2D-coordinates of vertices
polygon_object = polygon(Vertices)
```
- polygon can be open or closed (i.e. first = last vertex)
- holes can be defined by self-intersecting and opposite order of vertices inside than outside

### creating a solid of revolution:
```
polygon_object = polygon(Vertices, axis)
```
- axis = 0: revolution around x-axis
- axis = 1: revolution around y-axis

### attributes of polygon_object (geometrical properties):
    
    v: Vertex index
    e: Edge index (next of v)
    - .IsClockwise                          Boolean, order of vertices
    - .Area
    - .Angles[v]                            inner angles
    - .EdgesLength[e]
    - .EdgesMiddle[xe,ye]                   midpoints of edges
    - .CenterMass[x,y]                      centroid / center of mass
    - .SecondMomentArea                     [Ixx, Iyy, Ixy], with respect to origin
    - triangles:
        - .CenterOuterCircle[x,y]           circumcenter / center of circumsribed (outer) circle
        - .RadiusOuterCircle                radius of circumsribed (outer) circle
        - .CenterInnerCircle[x,y]           center of incircle (inner circle)
        - .RadiusInnerCircle                radius of incircle (inner circle)
    - solid of revolution:
        - .RotationVolume
        - .RotationSurfaces[e]
        - .CenterMassCrossSection[r,z]      r radial, z axial, CenterMass[r,z] now relates to solid

### methods of polygon_object:
    
    - abs(polygon_object)          returns area or volume of solid of revolution
    
    - plotting (matplotlib optional arguments can be used)
        - .plot()                              contour of polygon
        - .plotCenterMass()
        - .plotCenterEdges()
        - triangles:
            - .plotOutCircle()                 circumscribed (outer) circle
            - .plotIncircle()                  incircle (inner circle)
        - solid of revolution:
            - .plot3d()                        3D wireframe plot of solid
            - .plotRotationAxis()              only keyword arguments
            - .plotCenterMassCrossSection()    for 2D plot
    
    - point testing
        - polygon_object(point), .isPointInside(point)    true, if point [x,y] is inside of polygon (not on the edge)
        - .isPointOnEdge(point)                           true, if point [x,y] is on any edge of polygon
    
    - manipulation (translation, rotation & scaling)
        - polygon_object + [dx,dy] , polygon_object - [dx,dy] , .move([dx,dy])
                translation by distances dx,dy in x,y-direction
        
        - .centerOrigin()
                moves origin of coordinate system to center of mass
                                        
        - .rotate(angle,[cx,cy]) , .rotateClockwise(angle,[cx,cy])
                (counter)-clockwise rotation by angle / °
                with respect to point [cx,cy] (optional, default center of mass)
                                        
        - polygon_object * [fx,fy] , polygon_object / [fx,fy] , .scale([fx,fy],[cx,cy])
                scaling by factors fx, fy in x,y-direction (negative: flip)
                with respect to point [cx,cy] (optional, default center of mass)

### prerequisites
- NumPy
- Matplotlib

## license:
MIT license. You are free to use the code any way you want, without liability or warranty.

Please reference my work if you use it.
