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

OpenGL - przesunięcie kwadratu w miejsce koła?
SP
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 10 lat
  • Postów:120
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?

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:8 dni
0
  1. Masz w dokumentacji.
  2. Ot, wystarczy napisać. Trochę programowania, trochę matematyki - kilka mnożeń, parę przekształceń...
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 7 godzin
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).

spartanPAGE
Ależ oczywiście
SP
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 10 lat
  • Postów:120
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:

Kopiuj
//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ć.

edytowany 2x, ostatnio: SPOJowiecaa
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:8 dni
0

Matematyka kolego. @Azarien powiedział jak to uzyskać

edytowany 1x, ostatnio: spartanPAGE
SP
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 10 lat
  • Postów:120
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.

edytowany 1x, ostatnio: SPOJowiecaa
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.

SP
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 10 lat
  • Postów:120
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?

Kopiuj
#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?

edytowany 1x, ostatnio: SPOJowiecaa
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...

SP
Też będzie projekt do zrealizowania, gra na zaliczenie to się tym zajmę więcej. Teraz chce tylko napisać ten program i uczyć się elektrotechniki i innych rzeczy. W poprzedni semestrze się przyłożyłem i byłem zwolniony z egzaminu.
SP
Zaraz wstawię jak mi się uda te przesuwanie na boki co wystukałem.
SP
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 10 lat
  • Postów:120
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ć:

Kopiuj
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:

Kopiuj
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:

Kopiuj
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.

edytowany 4x, ostatnio: SPOJowiecaa
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)