Niezgodność wartości

0

Witam, piszę program w openGL i mam pewien problem, ponieważ mam parametry osi(x,y) i chciałbym, aby po kliknięciu na figurę coś się działo, ale wartości (x,y) kursora są jakby inaczej 'liczone' niż wartości (x,y) figury. Jest może jakaś funkcja czy wzór, aby móc przyrównywać te dane?

0

Moja odpowiedź nie będzie merytoryczna.

Jesteś pewien że chcesz się nauczyć openGl? Może poszukałbyś jakichś łatwiejszych do opanowania technologi? Szybciej dostaniesz zadowalające Cię rezultaty?

0

Niestety ten program muszę dokończyć w OpenGL. Jakieś pomysły? :)

1

http://antongerdelan.net/opengl/raycasting.html

  • jeżeli jest to prosty 2 wymiarowy świat to po prostu przekształć pozycję
0

Napisałem dwa wzory i nie działa mi to poprawnie, mógłby ktoś mi pomóc? :)

bool cProstokat::is_clicked()
{
	POINT pnt;
	GetCursorPos( & pnt );
	float x__=x+(a/500)*pnt.x;
	float y__=y-(b/500)*pnt.y;
	float x_ = (1.0f * pnt.x) / 500 - 1.0f;//500 x 500 wymiary okna narazie deklaruje tak jak bedzie dzialac zmienie!
	float y_ = 1.0f - (1.0f * pnt.y) / 500;
	cout<<"X: "<<x<<"(x+a): "<<(x+a)<<" x_: "<<x_<<" x__: "<<x__<<endl;
	cout<<"Y: "<<y<<"(y+b): "<<(y+b)<<" y_: "<<y_<<" y__: "<<y__<<endl;
	if (x<x_ && (x+a)>x_ && y<y_ && (y+b)>y_)
	{
		return true;
	}
	else
		return false;
}
 
1

@Garniturek, czy ten kod:

return x*x*x-7*y*y+3y*x>0;

poprawnie liczy?
Czy nie wydaje ci się, że to głupie pytanie bez wyjaśnienia: co liczę, czym są y i x i w jakich są jednostkach?

0
class cFigura
{
protected:
    float x, y;
public:
virtual bool is_clicked()=0;
}
 
class cProstokat
    :public cFigura
{
    float a, b;
public:
    cProstokat();
    cProstokat(float _x, float _y, float _a, float _b);
    virtual bool is_clicked();
}
 
1

x,y - prawie na 100% to są współrzędne, ale czego? Lewego górnego rogu? Środka? W jakich jednostkach? Czy w tych samych co okienko? A może jak w MATLAB w skali 0..1
a,b - czemu nie d,u ? Co to takiego? W jakich jednostkach?

0
class cFigura
{
protected:
    float x, y, kat, R, G, B;

public:
    cFigura();
    virtual void rysuj()=0;
    virtual void skaluj(float skala)=0;
    virtual bool is_clicked()=0;
};
class cProstokat
    :public cFigura
{
    float a, b; //dlugosci bokow
public:
    cProstokat();
    cProstokat(float _x, float _y, float _a, float _b);
    virtual void rysuj();
    virtual void skaluj (float skala);
	virtual bool is_clicked();
};
cScena a;
vector<cFigura*>::iterator  it;
int main(int argc, char* argv[])
{
	cProstokat pr;
	a.tab.push_back(&pr);
	it = a.tab.begin();
	glutInit(&argc,argv);
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(0,0);
	glutCreateWindow("simple");
	glutDisplayFunc(rysuj);
	glutMouseFunc(Mysz);
	glutKeyboardFunc(klawisz);// key musi byc funkcja, nie moze byc metoda
	a.init();
	glutMainLoop();
	system("pause");
	return 0;
}
bool cProstokat::is_clicked()
{
	POINT pnt;
	GetCursorPos( & pnt );
	float x__=x-((a+x)/500)*pnt.x;//probowalem cos z internetu, ale lipa
	float y__=y-(b/500)*pnt.y;
	float x_ = (1.0f * pnt.x) / 500 - 1.0f;
	float y_ = 1.0f - (1.0f * pnt.y) / 500;
	float y1=pnt.y-0.5*500;
	cout<<x<<" "<<x-a<<" "<<pnt.x<<" "<<x__;
	//	if (x<x_ && (x+a)>x_ && y<y_ && (y+b)>y_)
	if (x-a/2<x__ && x+a/2>x__)// && y-b/2<pnt.y && y+b/2>pnt.y)
	{
		return true;
		cout<<"3"<<endl;
	}
	else
		return false;
}
cFigura::cFigura()
{
	x=1; y=1;
	kat = 1;
	R=0.5; G=0.5; B=0.5; 
}

cProstokat::cProstokat()
{
	x=1; y=1;
	a=1; b=1;
}

cProstokat::cProstokat(float _x, float _y, float _a, float _b)
{
	x=_x; y=_y;
	a=_a; b=_b;
}
void cScena::init()
{
	glClearColor (0.0, 0.0, 0.0, 0.0);
	glColor3f(1.0, 1.0, 1.0);
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity ();
	glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);  //stawia kamere na scene
	glMatrixMode (GL_MODELVIEW);
	glLoadIdentity ();
}
 
1

Nadal nie odpowiedziałeś na pytania.
Więc czekaj sobie na kogoś kto dobrze zna glut'a oraz C++ albo odpowiedz na pytania, wtedy każdy kto rozumie programowanie (nie koniecznie C++ i nie koniecznie zna gluta) - będzie w stanie ci poprawnie odpowiedzieć.

0

x, y współrzędne środka figury, które są równe (1,1) na start (można przesuwać). Kiedy kliknę na ekran to współrzędne kursora na środku figury są równe (506,31) (mniej więcej). Muszę, więc jakoś przekształcić te współrzędne kursora i potrzebuję w tym pomocy

1

Podrzuć rzut okienka w postaci bmp/jpg/png/whatever z zaznaczeniem miejsca Klicka mniej-więcej krzyżykiem (ma to być raczej w 1/4 .. 1/3 wysokości/szerokości) do tego podaj wartości liczbowe dla:
x, y, a, b, pnt.x, pnt.y oraz wskaż czy a to szerokość czy wysokość, to samo dla b (dla kontroli bo zaraz się okaże że i to i tamto jest np szerokością).

0

Nie masz narysowanego prostokąta, czy to białe to ten prostokąt?
Jeżeli tak to coś tu się nie zgadza, mówiłeś że masz rozmiar 500x500 a widzę pnt.x 802

0

No taki szarawy kolor akurat był ustawiony ;)
Rozmiar okienka:

glutInitWindowSize(500,500);
 
0

To sprawdź jakie mają wartości pnt.x i pnt.y przy kliku w same rogi okienka.

0

Właśnie chciałem pisać. Mam źle układ współrzędnych chyba, bo lewy górny róg powinien mieć wartości (0,0), a ma po kliknięciu (841,85)
Rozmiar okna jest 500x500, ponieważ różnice między rogami takie są, ale coś nie tak z początkiem układu współrzędnych

0

Uparcie brnąc tą metodą znalazłem funkcje ScreenToClient(), która wydaje się być idealnym rozwiązaniem mojego problemu, ale mam problem z użyciem jej. Próbowałem takich sposobów, ma ktoś pomysł jak to powinno wyglądać?

 
HWND hw;
GetCursorPos( & pnt );
pnt= ScreenToClient(&pnt);//TUTAJ ERROR =error C2660: 'ScreenToClient' : function does not take 1 arguments
ScreenToClient(hw, &pnt); //Kompiluje się, lecz nie działa
ScreenToClient(NULL, &pnt);//Kompiluje się, lecz nie działa
1

Do ScreenToClientmusisz przekazać uchwyt do okienka, nie wiem czy glut coś takiego udostępnia.
A nawet jeżeli, to nadal masz brak danych, zauważ że na obrazku co podałeś (uwzględniając x=0.1 a=1) to okienko jest wyskalowane od -0.3 do +1.7 podejrzewam że nie masz skąd wytrzasnąć te liczby a bez nich nic nie wyliczysz.
Więc użyj może "glutowskiego" sposobu na współrzędne -jest szansa że już będą w odpowiedniej skali.

0

Miałem to rozwiązanie praktycznie cały czas przed sobą i go nie znałem. Teraz kursor myszki działa jak należy, wielkie dzięki @_13th_Dragon.
Teraz jeszcze muszę wymyślić jak ogarnąć, że kliknięcie było nad figurą :)

1
(left<=x)&&(x<=right)&&(top<=y)&&(y<=bottom)

z tym że wygląda mi na to że glut odwraca oś pionową, więc: (left<=x)&&(x<=right)&&(bottom<=y)&&(y<=top)

1 użytkowników online, w tym zalogowanych: 0, gości: 1