Я пытаюсь понять ответ (скопируйте / вставлен ниже), который изложен здесь: https://stackoverflow.com/a/ 3838294/1541165

Проблема в том, что это на C ++, и я хочу применить описанное решение на PHP.

Может ли кто-нибудь помочь немного с переводом? Как бы A.x - B.x выглядел бы в PHP?

первый шаг; переместить исходную точку.

x '= A.x - B.x y' = A.y - B.y

второй шаг, выполнить вращение

x '' = x '* cos (C) - y' * sin (C) = (A.x-B.x) * cos (C) - (A.y-B.y) * sin (C)

y '' = y '* cos (C) + x' * sin (C) = (A.y-B.y) * cos (C) + (A.x-B.x) * sin (C)

третий и последний шаг, переместите рамку координат назад

x '' '= x' '+ B.x = (A.x-B.x) * cos (C) - (A.y-B.y) * sin (C) + B.x

y '' '= y' '+ B.y = (A.y-B.y) * cos (C) + (A.x-B.x) * sin (C) + B.y

И ПРЕСТО! у нас есть наша формула вращения. Я отдам его вам без всех этих расчетов:

Поворот точки A вокруг точки B на угол C

A.x '= (A.x-B.x) * cos (C) - (A.y-B.y) * sin (C) + B.x

A.y '= (A.y-B.y) * cos (C) + (A.x-B.x) * sin (C) + B.y

0
gtilflm 23 Янв 2014 в 08:32

1 ответ

Лучший ответ

A и B - это просто структуры C ++, содержащие два числа с плавающей запятой, для этого в PHP вы должны создать простой класс Point:

class Point {
    public $X;
    public $Y;
    public function __construct($x = 0, $y = 0) {
        $this->X = $x;
        $this->Y = $y;
    }
}

Когда у вас есть этот класс, вы можете создать точки A и B следующим образом:

$A = new Point(0, 1);
$B = new Point(1, 0);

С этими двумя точками и углом поворота $ C в радианах:

$C = 3.14;

// The long way
$x1 = $A->X - $B->X;
$y1 = $A->Y - $B->Y;

$sinC = sin($C);
$cosC = cos($C);

$x2 = $x1 * $cosC - $y1 * $sinC;
$y2 = $y1 * $cosC + $x1 * $sinC;

$resultX = $x2 + $B->X;
$resultY = $y2 + $B->Y;

// The quick way
$sinC = sin($C);
$cosC = cos($C);

$diff = new Point($A->X - $B->X, $A->Y - $B->Y);
$result = new Point($diff->X * $cosC - $diff->Y * $sinC + $B->X, 
                    $diff->Y * $cosC + $diff->X * $sinC + $B->Y);

Надеюсь это поможет!

1
cioffstix 23 Янв 2014 в 09:05