математики, вы снова мне нужны :(

Discussion in 'Болталка' started by Ponchik, 19 Feb 2011.

  1. Ponchik

    Ponchik Хлебо-булочное изделие

    Joined:
    30 Aug 2005
    Messages:
    687
    Likes Received:
    807
    Reputations:
    311
    уже 3й мой вопрос по математике, сам удивляюсь
    Вот смарите, вот есть такие точки

    [​IMG]

    нужно точки C и B повернуть на 90 градусов против часовой стрелки относительно точки A, тоесть получится вот так

    [​IMG]

    получается координаты
    A (-3;1)
    до:
    B (-1;-4)
    C (-2;-3)
    после поворота на 90 градусов (или -90 или 270, хз как правильно):
    B (2;3)
    C (1;2)

    Вооот... Внимание вопрос: какой формулой вычислить куда переносить точки, для формулы есть
    AX - координаты точки A по оси X
    AY - координаты точки A по оси Y
    BX - координаты точки B по оси X
    BY - координаты точки B по оси Y
    R - угол поворота
    для точки C уже понятно, что такая же формула

    кому интересно чего я такое делаю, есть вот этот кораблик, он состоит из 40 частей, и его надо поворачивать, а вместе с корпусом переносить все части относительно корпуса
     
  2. оlbaneс

    оlbaneс Moderator

    Joined:
    5 Nov 2007
    Messages:
    1,378
    Likes Received:
    1,096
    Reputations:
    356
    понч, наверное лучше тут спросить http://www.gamedev.ru/code/forum/?id=16014
     
    _________________________
    #2 оlbaneс, 19 Feb 2011
    Last edited: 19 Feb 2011
  3. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    поворот векторов + смещение осей. что тут сложного?
     
  4. satana666

    satana666 Member

    Joined:
    10 Apr 2009
    Messages:
    0
    Likes Received:
    24
    Reputations:
    6
    А(AX; AY)
    B(BX; BY)
    R-угол
    x1=(BX-AX)*cosR-(BY-AY)*sinR
    y1=(BX-AX)*sinR+(BY-AY)*cosR
     
  5. FewG

    FewG Member

    Joined:
    25 Dec 2009
    Messages:
    136
    Likes Received:
    12
    Reputations:
    0
    m - точка вращения
    p - Объект вращения
    beta - Угол вращения

    alpha = arctan((py - my)/(px - mx))
    r = sqrt( (py - my)^2 + (px - mx)^2 )

    px´ = r*cos(alpha + beta)
    py´ = r*sin(alpha + beta)

    P´ (px´ + mx|py´ + my)
     
  6. Ponchik

    Ponchik Хлебо-булочное изделие

    Joined:
    30 Aug 2005
    Messages:
    687
    Likes Received:
    807
    Reputations:
    311
    мну Hunter1121 всё научил и объяснил, всем спасибо, все свободны
    ща в пыхе сделаю, выложу

    PHP:
    <?php
    $start_position_AX 
    = -3// вокруг чего вращать X
    $start_position_AY 1;  // вокруг чего вращать Y
    $start_position_BX = -1// что вращать X
    $start_position_BY = -4// что вращать Y
    $ugol = -90;             // угол вращения
    $PI 3.1415926535897932384626433832795// ПИ же


    //перевести (в новую систему) точку A в 0;0 и B отностельно неё
    $new_BX $start_position_BX-$start_position_AX;
    $new_BY $start_position_BY-$start_position_AY;
    echo 
    "new_BX = $new_BX<br>new_BY = $new_BY<br>";


    //крутим в новой системе
    $radian $ugol*($PI/180); // радиан для функций COS и SIN
    echo "Радиан = $radian<br>";
    $x1 $new_BX*cos($radian)+$new_BY*sin($radian);
    $y1 = -$new_BX*sin($radian)+$new_BY*cos($radian);
    echo 
    "x1 (в новой) = $x1<br>y1 (в новой) = $y1<br>";


    //переводим результат обратно в старую
    $x_v_staroi $x1+$start_position_AX;
    $y_v_staroi $y1+$start_position_AY;
    echo 
    "X в старой = $x_v_staroi<br>Y в старой = $y_v_staroi<br><br><br>";

    echo 
    "Мы вращали точку B({$start_position_BX};{$start_position_BY}) вокруг точки A({$start_position_AX};{$start_position_AY}) на $ugol градусов<br>
    координаты точки B получились (
    {$x_v_staroi};{$y_v_staroi})";
    ?>
    получаца
    Code:
    Мы вращали точку B(-1;-4) вокруг точки A(-3;1) на -90 градусов
    координаты точки B получились (2;3)
     
    #6 Ponchik, 19 Feb 2011
    Last edited: 19 Feb 2011
  7. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
  8. FewG

    FewG Member

    Joined:
    25 Dec 2009
    Messages:
    136
    Likes Received:
    12
    Reputations:
    0
    Ponchik, Вращение будет 90°, а не -90°. Это так к слову.

    На Питоне:

    Code:
    from math import atan, cos, sin, sqrt
    
    class Point(object):
    
        def __init__(self, x = 0, y = 0):
            self.x = x
            self.y = y
    
        def __str__(self):
            return "Point(" + str(self.x) + ", " + str(self.y) + ")"
    
        def __add__(self, other):
            return self.x.__add__(other.x), self.y.__add__(other.y)
    
        def __sub__(self, other):
            return self.x.__sub__(other.x), self.y.__sub__(other.y)
    
    class Rotation(object):
    
        def __init__(self, P1 = Point(), P2 = Point(), Winkel = 0):
    
            self.P1 = P1
            self.P2 = P2
            self.Winkel = Winkel
    
        def __str__(self):
            mPoint = "M(" + str(self.P1.x) + ", " + str(self.P1.y) + ")"
            rPoint = "P(" + str(self.P2.x) + ", " + str(self.P2.y) + ")"
            rAngle = str(self.Winkel) + "°"
    
            return "Пункт " + rPoint + " после вращения вокруг " + mPoint + " на " + rAngle + ","
    
        def length(self):
    
            DifX = (self.P2.x - self.P1.x) ** 2
            DifY = (self.P2.y - self.P1.y) ** 2
    
            return sqrt(DifX + DifY)
    
        def berechnen(self):
    
            alpha = atan((self.P2.y - self.P1.y) / (self.P2.x - self.P1.x))
    
            PX = round(self.length()*cos(alpha + atan(self.Winkel)), 1)
            PY = round(self.length()*sin(alpha + atan(self.Winkel)), 1)
            PAR = Point(PX, PY) + self.P1
            
            return self.__str__() + " приобрёл следующие координаты P´" + str(PAR) + "."
    
    def main():
    
        P1 = Point(-3, 1)
        P2 = Point(-2, -3)
        Winkel = 90
        
        print(Rotation(P1, P2, Winkel).berechnen())
    
    
    if __name__ == "__main__": main()
     
    #8 FewG, 20 Feb 2011
    Last edited: 20 Feb 2011
Loading...