OpenGL - przesunięcie kwadratu w miejsce koła?

0

Drugi semestr, zaczęliśmy OpenGL, tylko dwa zajęcia, mam taki kod: http://wklej.org/id/1663003/

I takie dwa zadania:

user image

Jaki jest 3 argument dla tej funkcji glutTimerFunc? I jak do tego się zabrać z tym kodem?

0
  1. Masz w dokumentacji.
  2. Ot, wystarczy napisać. Trochę programowania, trochę matematyki - kilka mnożeń, parę przekształceń...
1
  1. Ot, wystarczy napisać. Trochę programowania, trochę matematyki - kilka mnożeń, parę przekształceń...

Oscylację wokół środka można zrobić jako złożenie sinusa w poziomie i w pionie (Najlepiej z innym okresem).

0
spartanPAGE napisał(a):
  1. Masz w dokumentacji.
  2. Ot, wystarczy napisać. Trochę programowania, trochę matematyki - kilka mnożeń, parę przekształceń...
Azarien napisał(a):
  1. Ot, wystarczy napisać. Trochę programowania, trochę matematyki - kilka mnożeń, parę przekształceń...

Oscylację wokół środka można zrobić jako złożenie sinusa w poziomie i w pionie (Najlepiej z innym okresem).

Napisałem 6 zadanie, tylko nie wiem czy o to chodziło, kwadrat przesuwa mi się w środek koła, o to chodziło?

Kod:

//Zmienne i funkcje:
int licznik;
static void timerCallback(int value)
{
        
        if (licznik<50)

        {
                licznik++;
                x -= dx / 50;
                y -= dy / 50;
                glutPostRedisplay();
                glutTimerFunc(100, timerCallback, value);
        }

//Kod główny:
case 'p':

                dx = x - ox;
                dy = y - oy;
                licznik = 0;
                licznik++;
                timerCallback(0);
                break;
}

A co do oscylacji, to nie mam pojęcia jak się za to zabrać.

0

Matematyka kolego. @Azarien powiedział jak to uzyskać

0
spartanPAGE napisał(a):

Matematyka kolego. @Azarien powiedział jak to uzyskać

Żadna matematyka, tylko trzeba podpowiedzieć jak to zapisać w kodzie, a nie matma... Bo jak wykres sinusa wygląda to wiem, poza tym nie powiedział, że musi oscylować sinusoidalnie, tylko może na boki.

1

nie patrz na wykres sinusa, bo on tutaj nie ma nic do rzeczy. Weź popatrz na to, jakie wartości zwraca ta funkcja. I tak, tutaj chodzi o matematykę, a nie o to jak zapisać to w kodzie. Podstawiaj sobie do sinusa po kolei 1, 2, 3 stopnie itp i sprawdzaj jakie wartości zwraca.

0
misiakufal_not_logge napisał(a):

nie patrz na wykres sinusa, bo on tutaj nie ma nic do rzeczy. Weź popatrz na to, jakie wartości zwraca ta funkcja. I tak, tutaj chodzi o matematykę, a nie o to jak zapisać to w kodzie. Podstawiaj sobie do sinusa po kolei 1, 2, 3 stopnie itp i sprawdzaj jakie wartości zwraca.

Mam koło siebie tabele i wiem jakie zwraca, a to żeby to w kodzie, to już inna sprawa, chyba nie?

Mam taki kod obecnie, narysowałem trójkąt równoboczny. Jakiej funkcji użyć, żeby przesuwało się to cały czas?

#include "glut.h"
#include "math.h"

float x = 0, y = 0;

void drawCircle(float xc, float yc, float rad)
{
	//
	// draw a circle centered at (xc,yc) with radius rad
	//
	glPushMatrix();
	glTranslatef(xc, yc, 0);
	glBegin(GL_LINE_LOOP);
	//
	for (int angle = 0; angle<365; angle = angle + 5)
	{
		float angle_radians = angle * (float)3.14159 / (float)180;
		float x = rad * (float)cos(angle_radians);
		float y = rad * (float)sin(angle_radians);
		glVertex3f(x, y, 0);
	}
	//
	glEnd();
	glPopMatrix();
}

void display(void)
{
	/* clear window */

	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	glTranslatef(x, y, 0);
	//glRotatef(kat,0,0,1); rotacja w okolo osi z

	/* draw unit square polygon */
	glBegin(GL_TRIANGLES);
	glVertex2f(-0.5, -0.5);
	glVertex2f(0,0.4);
	glVertex2f(0.5, -0.5);
	
	glEnd();

	/* flush GL buffers */
	glPopMatrix();
	glFlush();
}

static void Key(unsigned char key, int x_d, int y_d)
{

	switch (key) {
	case '1':
		x += .1;
		y += .1;
		glutPostRedisplay();
		break;
	case '2':
		x -= .1;
		y -= .1;
		glutPostRedisplay();
		break;
	case 27:
		exit(0);
	}
}

void init()
{
	/* set clear color to black */
	glClearColor(0.0, 0.0, 0.0, 0.0);
	/* set fill  color to white */
	glColor3f(1.0, 1.0, 1.0);

	/* set up standard orthogonal view with clipping */
	/* box as cube of side 2 centered at origin */
	/* This is default view and these statement could be removed */
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(500, 500);
	glutInitWindowPosition(0, 0);
	glutCreateWindow("simple");
	glutDisplayFunc(display);
	glutKeyboardFunc(Key);
	init();
	glutMainLoop();

	return 0;
}

Drodzy koledzy zróbmy tak, ja chcę tylko ruch na boki, zaś pomyślimy o sinusie.

Mój trójkąt jest ustawiony w środku okienka, jego podstawa ma rozmiar 1, całe okienko 2. Więc na początek musi się przesunąć w prawo o 0.5 jednostki w prawo i zaś na zmianę raz w lewo raz w prawo o jedną jednostkę - jakiś pomysł jak to osiągnąć? Nie męcząc się zbytnio z różnymi if`ami?

0

Chcesz żeby się przesuwało na boki względem jakiegoś punktu środkowego prawda? To teraz jak byś łaskawie zobaczł na sinus, o zwraca on wartości od -1 do 1 w zależności do kąta. Jeśli będziesz w pętli podawał kąt coraz większy, to będzie powoli przechodził z -1 do 1 i z powrotem. Teraz sobie tego sinusa pomnóż np razy 2 i już masz wartości -20 do 20. Dodaj tą wartość do położenia kwadratu w wybranej osi i będziesz miał oscylujący kwadrat.

To czego CI brakuje o nawet nie matematyka, nie programowanie. To połączenie jednego z drugim i wykorzystanie matematyki. Nie widzisz pewnch zależności i sposobów wykozystania. Musisz więcej ćwiczyć i pisać rzeczy dla siebie samego bo inaczej to marnie będzie...

0
misiakufal_not_logge napisał(a):

Chcesz żeby się przesuwało na boki względem jakiegoś punktu środkowego prawda? To teraz jak byś łaskawie zobaczł na sinus, o zwraca on wartości od -1 do 1 w zależności do kąta. Jeśli będziesz w pętli podawał kąt coraz większy, to będzie powoli przechodził z -1 do 1 i z powrotem. Teraz sobie tego sinusa pomnóż np razy 2 i już masz wartości -20 do 20. Dodaj tą wartość do położenia kwadratu w wybranej osi i będziesz miał oscylujący kwadrat.

Poza tym co z tego, że mi to napisałeś, jak nie wytłumaczyłeś. Mam zapisać funkcję sinusa i co dalej? Wy mówicie, a nie tłumaczycie co po kolei robić.

To może zapisze to co mam, bo widzę, że macie mnie za kogoś kto czeka na gotowca, a sami nie pragniecie wytłumaczyć:

static void timerCallback(int value)
{
	
		if (x > -0.48)
		{
			if (licznik < 50)

			{
				
				x -= 0.5 / 50;
				glutPostRedisplay();
				glutTimerFunc(100, timerCallback, value);
			}
		}
		else
		{
			x += 0.5 / 50;
			glutPostRedisplay();
			glutTimerFunc(100, timerCallback, value);
		}

	
}

Trójkąt równoboczny przesuwa się od środka do lewej krawędzi i dalej nie wiem jak zrobić, żeby przesuwał się na zmianę o jedną jednostkę w prawo i w lewo i tak cały czas. Teraz przesuwanie się te jest ustawione na klawisz.

@Edit

Ktoś mi zamierza z łaski swojej pomóc, jeśli oczekujecie kasy to powiedzcie wprost. Bo nie wiem czy marnuje czas pisząc tu czy nie:

Chciałem zrobić przesuwanie od boku do boku, ustawiłem trójkąt z wierzchołkiem dotykającym lewej krawędzi, sterowanie miało odbywać się poprzez dwa ify jeśli licznik jest podzielny przez "2" przesuwa się w prawo (standardowo na początku licznik ustawiony na '0') jeśli osiągnie x=1, miał licznik zmieniać się na '1' i ze względu na drugi if (sterowanie drugim ifem jeśli licznik jest liczbą nieparzystą miało przesuwać się w lewo) do momentu osiągnięcia x=-1, wtedy licznik zmienia się na '0' i tak w kółku, ale nie wiem czemu licznik mi się nie chce zmieniać. Czy zmienna 'x' pod którą ustawiam if'y to któryś z wierzchołków trójkąta czy co konkretnie?

Kod:

static void timerCallback(int value)
{
	
	if (x <= 1 && x>=-1)
	{
		
		
		if (licznik %2 == 0)

		{
			
			x += 0.5 / 50;
			glutPostRedisplay();
			glutTimerFunc(100, timerCallback, value);
			
			
		}
		else if (licznik % 2 == 1)
		{
			x -= 0.5 / 50;
			glutPostRedisplay();
			glutTimerFunc(100, timerCallback, value);
		}

		if (x == 1) licznik = 1;
		if (x == -1) licznik = 0;
		
	}
	
}

@Edit 2

Udało mi się osiągnąć oscylację na boki w ten sposób:

static void timerCallback(int value)
{
	
	if (x <= 1 && x>=0)
	{
		
		licznik++;

		if (licznik<100)

		{
			
			x += 0.5 / 50;
			glutPostRedisplay();
			glutTimerFunc(100, timerCallback, value);
			
			
		}
		if (licznik>=100)
		{
			x -= 0.5 / 50;
			glutPostRedisplay();
			glutTimerFunc(100, timerCallback, value);

			if (licznik==198) licznik = 0;
		}

		
	}
	
}

Jak wrócę spróbuję z sinusem.

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