Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
James
Člen
Avatar
James:11.11.2016 22:21

ahoj mam bod na plose a kulicku kterou okolo toho bodu rotuju akorat ze kazdy otoceni okolo se trosku oddali a nevim proc tady je kod, dekuju :)

float angle = (float)(Math.atan2(y - 250, x - 250) - Math.PI/2);

x -= Math.cos(angle)*25;
y -= Math.sin(angle)*25;
Odpovědět
11.11.2016 22:21
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na James
gcx11:12.11.2016 0:15

Ahoj, myslím, že to je z toho důvodu, že tvůj výpočet je nepřesný na takovéto počítání. Ve floatu se Ti postupně usazuje nepřesnost, která způsobí výchylku.

Jak myslíš, že se bude chovat tento kus kódu?

float i = 0.0f;
while (i != 1.0f){
    i += 0.1f;
}
 
Nahoru Odpovědět
12.11.2016 0:15
Avatar
James
Člen
Avatar
Odpovídá na gcx11
James:12.11.2016 6:44

No, ano k tomuto jsem došel taky ale nevěděl jsem jak to vyřešit a za druhé asi to je ránem nebo nevím ale nevím jak zakompojnovat tento kus kódu do výpočtu, děkuji za odpověď :))

Nahoru Odpovědět
12.11.2016 6:44
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
James
Člen
Avatar
Odpovídá na gcx11
James:12.11.2016 6:48

Napadlo mě to po ránu vyřešit trošku horším způsobem :D

float angleleft = (float)(Math.atan2(y - 250, x - 250) - Math.PI/2);
                float angle = (float)(Math.atan2(y - 250, x - 250));

                x -= Math.cos(angleleft)*16;
                y -= Math.sin(angleleft)*16;

                float distance = (float)Math.sqrt((x-250)*(x-250)+(y-250)*(y-250));

                if (distance > 100) {
                        x -= Math.cos(angle);
                        y -= Math.sin(angle);
                }
                else if (distance < 100) {
                        x += Math.cos(angle);
                        y += Math.sin(angle);
                }
Nahoru Odpovědět
12.11.2016 6:48
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
James
Člen
Avatar
Odpovídá na James
James:12.11.2016 6:54

Ale k čemu jsem došel je že je to nepoužitelné :/ :D

Nahoru Odpovědět
12.11.2016 6:54
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na James
Atrament:12.11.2016 7:46

Float je nevhodný typ pro výpočty při kterých záleží na naprosté přesnosti. Použij BigDecimal.

 
Nahoru Odpovědět
12.11.2016 7:46
Avatar
Odpovídá na James
Drahomír Hanák:12.11.2016 9:23

Ten kosinus a sinus vynásobený poloměrem je přímo pozice nějamého bodu na kružnici. V kódu to ale máš jako posun

 
Nahoru Odpovědět
12.11.2016 9:23
Avatar
James
Člen
Avatar
Odpovídá na Drahomír Hanák
James:12.11.2016 10:22

Děkuju za odpověď ale ( nemyslím to špatně ) potřebuju to videť v kódu :D :))) děkuju :)

Nahoru Odpovědět
12.11.2016 10:22
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
James
Člen
Avatar
Odpovídá na James
James:12.11.2016 10:49

Můj aktuální kód vypadá takhle :)

x -= Math.cos(Math.atan2(y - 300, x - 300) - (Math.PI / 2)) * rotationSpeed;
y -= Math.sin(Math.atan2(y - 300, x - 300) - (Math.PI / 2)) * rotationSpeed;
Nahoru Odpovědět
12.11.2016 10:49
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na James
Tomáš Brůna:12.11.2016 11:10

Zkus oddelat znamenko pred '='

Nahoru Odpovědět
12.11.2016 11:10
Vi veri universum vivus vici
Avatar
James
Člen
Avatar
Odpovídá na Tomáš Brůna
James:12.11.2016 11:12

Potom zůstane objekt nehybný :)))

Nahoru Odpovědět
12.11.2016 11:12
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na James
Tomáš Brůna:12.11.2016 11:47

Aha, promiň :-)

Nahoru Odpovědět
12.11.2016 11:47
Vi veri universum vivus vici
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na James
gcx11:12.11.2016 13:00

Tady je můj kód v Pythonu, na kterém mi to v noci fungovalo:

#!/usr/bin/env python3

from math import *

# všechno inty
x = 300
y = 300
max_x = x
max_y = y
min_x = x
min_y = y

while True:
    angle = int(atan2(y - 250, x - 250) - pi/2) # float -> int

    x -= int(cos(angle)*25) # float -> int
    y -= int(sin(angle)*25) # float -> int
    # testy, že je na maximu/minimu - mělo by vypisovat stejná čísla po chvíli
    if (x == max_x or y == max_y): print("Dosáhlo se maxima", x, y)
    if (x == min_x or y == min_y): print("Dosáhlo se minima", x, y)


    if (x > max_x): max_x = x
    if (y > max_y): max_y = y

    if (x < min_x): min_x = x
    if (y < min_y): min_y = y
Editováno 12.11.2016 13:02
 
Nahoru Odpovědět
12.11.2016 13:00
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na gcx11
gcx11:12.11.2016 13:13

Tohle nefunguje, už vidím, jak to létá.

 
Nahoru Odpovědět
12.11.2016 13:13
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na James
gcx11:12.11.2016 13:34

Tohle už jde:

#!/usr/bin/env python3

import pygame
import sys
from pygame.locals import *
from math import *

pygame.init()
fpsClock = pygame.time.Clock()

screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Rotation')


center_x = 300
center_y = 200
perimeter = 100
points = 100
i = 0

while True:
    screen.fill((0, 0, 0))

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    i = (i + 1) % points

    x = center_x + int(cos(2*pi*i/points)*perimeter)
    y = center_y + int(sin(2*pi*i/points)*perimeter)

    pygame.draw.circle(screen, (0, 200, 100), (x, y), 5, 0)

    pygame.display.update()
    fpsClock.tick(30)
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
12.11.2016 13:34
Avatar
James
Člen
Avatar
Odpovídá na gcx11
James:12.11.2016 13:53

Děkuju moc :)))))

Nahoru Odpovědět
12.11.2016 13:53
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.