Diskuze: Matematika v Javě

Java Java Matematika v Javě

Avatar
James
Člen
Avatar
James:

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. listopadu 22:21
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na James
gcx11:

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. listopadu 0:15
Avatar
James
Člen
Avatar
Odpovídá na gcx11
James:

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. listopadu 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:

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. listopadu 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:

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

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

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. listopadu 7:46
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na James
Drahomír Hanák:

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. listopadu 9:23
Avatar
James
Člen
Avatar
Odpovídá na Drahomír Hanák
James:

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

Nahoru Odpovědět 12. listopadu 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:

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. listopadu 10:49
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na James
Tomáš Brůna:

Zkus oddelat znamenko pred '='

Nahoru Odpovědět 12. listopadu 11:10
Lepší být šprt než blbec :)
Avatar
James
Člen
Avatar
Odpovídá na Tomáš Brůna
James:

Potom zůstane objekt nehybný :)))

Nahoru Odpovědět 12. listopadu 11:12
Slovo nikdy znamená že cesta k cíly je pouze o něco těžší než se zdálo.
Avatar
Tomáš Brůna
Redaktor
Avatar
Nahoru Odpovědět 12. listopadu 11:47
Lepší být šprt než blbec :)
Avatar
gcx11
Redaktor
Avatar
Odpovídá na James
gcx11:

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. listopadu 13:02
 
Nahoru Odpovědět  +1 12. listopadu 13:00
Avatar
gcx11
Redaktor
Avatar
Odpovídá na gcx11
gcx11:

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

 
Nahoru Odpovědět 12. listopadu 13:13
Avatar
gcx11
Redaktor
Avatar
Odpovídá na James
gcx11:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 12. listopadu 13:34
Avatar
James
Člen
Avatar
Nahoru Odpovědět 12. listopadu 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.