Diskuze: Matematika v Javě
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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;
}
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ěď
Napadlo mě to po ránu vyřešit trošku horším způsobem
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);
}
Float je nevhodný typ pro výpočty při kterých záleží na naprosté přesnosti. Použij BigDecimal.
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
Děkuju za odpověď ale ( nemyslím to špatně ) potřebuju to videť v kódu děkuju
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;
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
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)
Zobrazeno 16 zpráv z 16.