2 votes

Tracer les valeurs y d'un arc

J'essaie de tracer le segment d'un cercle (2D) comme un arc dans matplotlib. J'ai écrit une classe qui fournira les mathématiques pour le segment, comme la longueur de la corde, la hauteur de l'arc, etc. Je souhaite tracer les valeurs x y entre (0,0) et (0, longueur de corde).

Je représente actuellement les valeurs X sous forme de tableau numpy linspace (0, chordLength, 200). Je suis un peu perplexe quant à la manière de représenter les valeurs y sous la forme d'un tableau linspace similaire afin de pouvoir tracer ces points à l'aide de matplotlib. L'idée derrière tout cela est d'afficher la courbure de la terre entre deux points d'une longueur d'arc connue (distance du grand cercle). J'ai lu des articles sur le sinus et le cosinus, mais en dehors de l'utilisation de formules à l'emporte-pièce pour mes calculs géométriques, je suis quelque peu perdu quant à la manière de les appliquer pour obtenir mes valeurs en ordonnées.

Tout d'abord, la classe de cercle

import numpy as np

class Circle:

    def __init__(self,radiusOfCircle,lengthOfArc):
        self.radius = radiusOfCircle
        self.circumference = 2 * np.pi * self.radius
        self.diameter = self.radius * 2
        self.arcLength = lengthOfArc
        self.degrees = self.calcDegrees()
        self.radians = self.calcRadians()
        self.chordLength = self.calcChordLength()
        self.sagitta = self.calcSagitta()
        self.segmentArea = self.calcSegmentArea()
        self.arcHeight = self.calcArcHeight()

    #Setters and getters for the Circle class (TODO: setters)
    def getRadius(self):
        return self.radius

    def getCircumference(self):
        return self.circumference

    def getDiameter(self):
        return self.diameter

    def getArcLength(self):
        return self.arcLength

    def getRadians(self):
        return self.radians

    def getDegrees(self):
        return self.degrees

    def getChordLength(self):
        return self.chordLength

    def getSagitta(self):
        return self.sagitta

    def getSegmentArea(self):
        return self.segmentArea

    def getArcHeight(self):
        return self.arcHeight

    #Define Circle class methods

    #Calculate the central angle, in degrees, by using the arcLength
    def calcDegrees(self):
        self.degrees = (self.arcLength / (np.pi * self.diameter)) * 360 #Gives angle in degrees at centre of the circle between the two points (beginning and end points of arcLength)
        return self.degrees

    #Calculate the central angle in radians, between two points on the circle
    def calcRadians(self):#Where theta is the angle between both points at the centre of the circle
        self.radians = np.radians(self.degrees) # Convert degrees to radians to work with ChordLength formula
        return self.radians

    #Returns the chord lengths of the arc, taking theta (angle in radians) as it's argument
    #The chord is the horizontal line which separates the arc segment from the rest of the circle
    def calcChordLength(self):
        self.chordLength = 2*self.radius*np.sin(self.radians/2) #formula works for theta (radians) only, not degrees #confirmed using http://www.ambrsoft.com/TrigoCalc/Sphere/Arc_.htm
        return self.chordLength

    #Calculates the length of arc, taking theta (angle in radians) as its argument.
    def calcArcLength(self):
        self.arcLength = (self.degrees/360)*self.diameter*np.pi #confirmed using http://www.ambrsoft.com/TrigoCalc/Sphere/Arc_.htm
        return self.arcLength

    #Calculates the sagitta of the arc segment.  The sagitta is the horizontal line which extends from the bottom
    #of the circle to the chord of the segment
    def calcSagitta(self):
        self.sagitta = self.radius - (np.sqrt((self.radius**2)-((self.chordLength/2)**2))) #Confirmed correct against online calculator https://www.liutaiomottola.com/formulae/sag.htm
        return self.sagitta

    #Calculates the area of the circular segment/arc).
    def calcSegmentArea(self):
        self.segmentArea = (self.radians - np.sin(self.radians) / 2) * self.radius**2
        return self.segmentArea

    #Calculate the height of the arc
    #Radius - sagitta of the segment
    def calcArcHeight(self):
        self.arcHeight = self.radius - self.sagitta
        return self.arcHeight

Je n'ai pas beaucoup progressé avec le programme principal car l'une des premières tâches que je cherche à faire est de créer les valeurs y. Je ne sais pas si je peux le faire. Voici ce que j'ai jusqu'à présent

from circle import Circle
import numpy as np
import matplotlib.pyplot as plt

def main():
    #define centre point

    #Circle(radius,arc length)
    c1 = Circle(3440.065,35) #Nautical miles radius with 35Nm arc length
    chordLength = c1.getChordLength()
    arcHeight = c1.getArcHeight()

    centerX = chordLength/2
    centerY = 0

if __name__ == "__main__":
    main()

Dans le contexte, je souhaite utiliser cet "arc" pour y ajouter des données d'élévation, un peu comme dans le cas de l'installation d'un système d'alarme. https://link.ui.com/# . J'espère simuler une augmentation de la courbure sur la distance, que je peux utiliser pour une analyse approximative de la ligne de visée.

Cependant, la première étape consiste à obtenir les valeurs y.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X