Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ruch po elipsie, ale "pochylonej"
Forum PHP.pl > Inne > Hydepark
erix
Mam coś takiego:
Kod
var x = radius * Math.sin(degToRad(step));
var y = radius * Math.cos(degToRad(step));

to ruch po okręgu:



Kod
var x = radius * Math.sin(degToRad(step))*0.5;
var y = radius * Math.cos(degToRad(step));

po elipsie:



Ale nie mam pomysłu, w jaki sposób tę elipsę "pochylić":



Pogooglałem nieco i nigdzie nie znalazłem remedium; tylko rysowanie/torowanie po prostej elipsie. Może ktoś poratowałby wzorem/wskazówką byłego licealistę? snitch.gif

edit:

Hmm, wymodziłem coś takiego:
Kod
var angle = 30;

//so calculate x and y (converting angle into radians)
var y = -radius * Math.cos(degToRad(step))*Math.sin(degToRad(angle));
var x = -(radius * Math.sin(degToRad(step))+y)*(1-Math.sin(degToRad(angle)));

Ale chyba nie do końca to.
Speedy
W angielskiej wikipedii jest fajny opis, jak to zrobić winksmiley.jpg. Dla sportu zrobiłem wersję w C++, która generuje plik z danymi dla Matlaba tongue.gif. Elipsa rysuje się prawidłowo.

Kod
#include <iostream>
#include <cmath>
#include <fstream>

using namespace std;

/**
* @param float x - X coordinate
* @param float y - Y coordinate
* @param float a - Semimajor axis
* @param float b - Semiminor axis
* @param float angle - Angle of the ellipse
*/

void calculateEllipse(float x, float y, float a, float b, float angle, int steps)
{
    float alpha, sinalpha, cosalpha, beta, sinbeta, cosbeta, X, Y;
    // Angle is given by Degree Value
    beta = -angle * (M_PI / 180); // converts Degree Value into Radians
    sinbeta = sin(beta);
    cosbeta = cos(beta);
  
    float * XArray = new float[steps];
    float * YArray = new float[steps];

    for (int i = 0; i < 360; i += 360 / steps)
    {
        alpha = i * (M_PI / 180);  
        sinalpha = sin(alpha);
        cosalpha = cos(alpha);
        XArray[i] = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta);
        YArray[i] = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta);        
    }
    
    ofstream points;
    points.open("ellipse.m");
    
    points << "x = [ ";
    for (int i = 0; i < 360; i += 360 / steps)
        points << XArray[i] << ", ";
    points << "];" << endl;
    
    points << "y = [ ";
    for (int i = 0; i < 360; i += 360 / steps)
        points << YArray[i] << ", ";
    points << "]; " << endl;
    
    points << "plot(x,y);" << endl;
    points.close();
    delete[] XArray;
    delete[] YArray;
    
}

int main()
{
    calculateEllipse(10,10, 50, 20, 30, 360);
    system("pause");
    return 0;
}


Wyszło mi coś takiego:

Jabol
Rotacje robisz poprzez następującą transformacje:

R=[cos(a), sin(a);
-sin(a), cos(a)]
erix
~Speedy dostał pomógła. ;]

Sportowałem to sobie pod JS.
Kod
function degToRad(angle){
        return ((angle*Math.PI)/180);
    }
    
    var speed=3;    // steps moved at once
    var angle=70;   // rotation angle
    var a = 50;     // oval dim 1°
    var b = 20;     // oval dim 2°
    var step = 0;
    
    beta = -degToRad(angle);    // angle
    sinbeta = Math.sin(beta);   // helper 1
    cosbeta = Math.cos(beta);   // helper 2
    

    function move() {
        if(step>360){
            step=0;
        }
        
        var alpha = degToRad(step)
        var sinalpha = Math.sin(alpha);
        var cosalpha = Math.cos(alpha);
        
        var x = (a*cosalpha*cosbeta-b*sinalpha*sinbeta);
        var y = (a*cosalpha*sinbeta+b*sinalpha*cosbeta);

        document.getElementById('point').style.left = (100+x)+'px';
        document.getElementById('point').style.top = (95+y)+'px';
        step += speed;

    }


    window.onload = function(){
        setInterval(move, 10);
    }


~dr_bonzo, czyli tak, jak jest to w tym listingu? Bo jeśli dobrze zrozumiałem, to chyba to. [;
dr_bonzo
@erix: ale ossochozzi?
erix
A o jakiej transformacji napisałeś? tongue.gif

Jeśli dobrze rozumiem, to:
Kod
R=[cos(a), sin(a);
-sin(a), cos(a)]

jest wyrażone przez
Kod
XArray[i] = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta);
YArray[i] = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta);

zgadza się?
nospor
@erix to byl jabol a nie dr_bonzo tongue.gif
erix
Ups... Sory, Koledzy. [;

Dajcie im inne kolory.
mike
Cytat(erix @ 8.06.2009, 09:56:56 ) *
Dajcie im inne kolory.
Hmm, a to nie nick'i są identyfikatorami? tongue.gif
erix
Oj, zapędziłem się i najpierw spojrzałem na kolor grupy. ;p
dr_bonzo
Cytat
Dajcie im inne kolory.


^^ @erix: oj nospor, okularki sie przydadza smile.gif
tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.