| Programmierung und Webdesign Ruby, Java, Perl, C, C++, C# sowie PHP, Mysql, Webserver, CMS, Frameworks und mehr |
14.11.2009, 14:21
|
#1 (permalink)
| | Komplett-PC-Aufrüster
Mitglied seit: 19.11.2008 Ort: Hamburg
Beiträge: 114
| Winkel aus zwei Punkten/Längen (C++/OpenGL)
Hallo!
Zur Zeit versuche ich aus zwei verschiedene Punkten einen Winkel in Grad zu brechnen. Dazu habe ich folgende Formel formuliert : Code: b = atan((x1-x2)/(y1-y2))*180/M_PI
Ich bekomme zwar korekte Zahlen zurück, aber diese sind immer falsch. Nun will ich wissen was ICH falsch mache.  Wieder einmal brauche ich das für eine OpenGL Anwendung. Ich habe bereits danach gegooglt, aber außer eine genauso nutzlosen Berechnung mit atan2() nichts brauchbares gefunden.
Grüße
Jy-Falc00n
__________________ Q6600 @ 3,2 GHz @ 1,28v + Prolimatech Megahelems / GeForce XFX GTX 260 @ 1,05V (644|1404|1136) / 4096MB Corsair DDR2 RAM 800MHz / ASUS P5Q-E   |
| |
14.11.2009, 15:31
|
#2 (permalink)
| | Schraubenverwechsler
Mitglied seit: 08.07.2009
Beiträge: 13
| AW: Winkel aus zwei Punkten/Längen (C++/OpenGL)
Wie genau meinst du des, aus zwei Punkten einen Winkel zu bestimmen? Normalerweise tritt ein Winkel zwischen zwei Geraden auf |
| |
14.11.2009, 15:41
|
#3 (permalink)
| | Komplett-PC-Aufrüster
Mitglied seit: 19.11.2008 Ort: Hamburg
Beiträge: 114
| AW: Winkel aus zwei Punkten/Längen (C++/OpenGL)
Das ist mir schon klar.  Ich berechne ja auch aus denn Punkten die Längen.
__________________ Q6600 @ 3,2 GHz @ 1,28v + Prolimatech Megahelems / GeForce XFX GTX 260 @ 1,05V (644|1404|1136) / 4096MB Corsair DDR2 RAM 800MHz / ASUS P5Q-E   |
| |
14.11.2009, 15:42
|
#4 (permalink)
| | Schraubenverwechsler
Mitglied seit: 08.07.2009
Beiträge: 13
| AW: Winkel aus zwei Punkten/Längen (C++/OpenGL)
Kannst vllt. die gesamte Rechnung mal zeigen? Dann kann man sich eher was drunter vorstellen
|
| |
14.11.2009, 15:43
|
#5 (permalink)
| | BIOS-Overclocker
Mitglied seit: 09.01.2008 Ort: Auf deiner Festplatte
Beiträge: 3.109
| AW: Winkel aus zwei Punkten/Längen (C++/OpenGL)
Tangens wiederholt sich doch alle 180 Grad zieh mal von deinem Ergebnis 180°ab.
__________________ ASUS P5Q-E / Q9550@3600MHZ / Xigmatek Achilles /
820Gb Festplatte / ASUS ENGTX 275 / Corsair XMS 4x1Gb / Be Quiet Straight Power 550W Mein Traumdesign I think my pig is whisteling |
| |
14.11.2009, 17:06
|
#6 (permalink)
| | Komplett-PC-Aufrüster
Mitglied seit: 19.11.2008 Ort: Hamburg
Beiträge: 114
| AW: Winkel aus zwei Punkten/Längen (C++/OpenGL)
Also Gegeben sind :
X1,Y1 und X2,Y2
Das sind Punkte in einem Koordinaten System. Da ein Punkt alleine nicht reicht, berechne ich folgendermaßen die Ankathete : X1-X2. Genauso mit der Gegenkathete, Y1-Y2. Meines wissen nach muss ich nun Tanges anwenden. Da kein Winkel vorliegt, rechne ich nun (X1-X2) / (Y1-Y2). Denn Quotient jage ich nun durch durch atan(), also umgekertes Tangens. Zumschluss rechne ich das ganze noch in Grad um, * 180 / PI. Jedoch ist das ergebnis immer falsch. Als Test habe ich mal denn Zweiten Punkt im 90° Winkel plaziert, das ergebnis ist jedoch ca. 31°.
Hier ist noch mein Quellcode (recht Chaotisch  ) : Code: #define _USE_MATH_DEFINES
#include <iostream>
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
using namespace std;
GLdouble ox=0.0,oy=0.0,oz= 0.0;
int CursorX;
int CursorY;
float Xdevi;
float Ydevi;
float ang;
float enmX,enmY;
float a;
float angleofpoint2(float x1,float y1,float x2, float y2)
{
float b;
//b = atan2(y2 - y1, x2 - x1) * 180 / M_PI;
b = atan2(y2 - y1, x2 - x1) * 180 / 3.14159265;
return b;
}
void WinPosTo3DPos(int x, int y)
{
GLint viewport[4];
GLdouble modelview[16],projection[16];
GLfloat wx=x,wy,wz;
glGetIntegerv(GL_VIEWPORT,viewport);
y=viewport[3]-y;
wy=y;
glGetDoublev(GL_MODELVIEW_MATRIX,modelview);
glGetDoublev(GL_PROJECTION_MATRIX,projection);
glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&wz);
gluUnProject(wx,wy,wz,modelview,projection,viewport,&ox,&oy,&oz);
}
void PosByAngle(float angle,float lenght,float x, float y)
{
enmX = (sin(angle) * lenght) + enmX;
enmY = (cos(angle) * lenght) + enmY;
}
void initRender(int w, int h)
{
glEnable(GL_DEPTH_TEST);
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,
(double)w / (double)h,
1.0,
200.0);
WinPosTo3DPos(400,300);
}
void Render()
{
glDepthMask(true);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(0.8f,0.8f,0.6f);
glBegin(GL_TRIANGLE_STRIP);
glVertex3d(-50.0f,50.0f,-51.0f);
glVertex3d(-50.0f,-50.0f,-51.0f);
glVertex3d(50.0f,50.0f,-51.0f);
glVertex3d(50.0f,-50.0f,-51.0f);
glEnd();
glLoadIdentity();
a = angleofpoint2(enmX, enmY, CursorX , CursorY);
//ang = sin(
cout << a<< " ";
PosByAngle(a, 0.0f, enmX, enmY);
glTranslatef(enmX,enmY,-50.0f);
glColor3f(1.0f,0.0f,0.0f);
glutSolidSphere(1,8,8);
glLoadIdentity();
glDepthMask(false);
glColor3f(0.0f,1.0f,0.0f);
WinPosTo3DPos(CursorX,CursorY);
glTranslatef(ox,oy,oz);
glutSolidSphere(1,16,16);
glLoadIdentity();
glutSwapBuffers();
}
void MouseMang(int button, int state, int x, int y) // Mouse handle function
{
WinPosTo3DPos(x,y);
cout << "Done!";
}
void MouseMang_Move(int x, int y)
{
CursorX = x;
CursorY = y;
}
void Game(int vaule)
{
glutPostRedisplay();
glutTimerFunc(25, Game,0);
}
int main(int argc, char** argv)
{
enmX = 2.0f;
enmY = 0.0f;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("OpenGL");
initRender(800,600);
glutPassiveMotionFunc(MouseMang_Move);
glutMouseFunc(MouseMang);
glutDisplayFunc(Render);
glutTimerFunc(1000, Game,0);
glutMainLoop();
return 0;
}
__________________ Q6600 @ 3,2 GHz @ 1,28v + Prolimatech Megahelems / GeForce XFX GTX 260 @ 1,05V (644|1404|1136) / 4096MB Corsair DDR2 RAM 800MHz / ASUS P5Q-E   |
| |
14.11.2009, 21:08
|
#7 (permalink)
| | Komplett-PC-Aufrüster
Mitglied seit: 19.11.2008 Ort: Hamburg
Beiträge: 114
| AW: Winkel aus zwei Punkten/Längen (C++/OpenGL)
Ich hab denn Fehler Gefunden... Das hätte auch garnicht funktionieren können wenn ich denn Winkel aus Fenster und 3D Koordinaten erechnen will.  Anfänger Fehler halt.  Die Formel war aber richtig.
Grüße
Jy-Falc00n
__________________ Q6600 @ 3,2 GHz @ 1,28v + Prolimatech Megahelems / GeForce XFX GTX 260 @ 1,05V (644|1404|1136) / 4096MB Corsair DDR2 RAM 800MHz / ASUS P5Q-E   |
| |
Forumregeln
| Es ist Ihnen nicht erlaubt, neue Themen zu verfassen. Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten. Es ist Ihnen nicht erlaubt, Anhänge hochzuladen. Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten. HTML-Code ist aus. | | | Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 Uhr. | |