Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Jazyky které ovládám: ahk, javascript a php.
Jak bych to měl udělat pokud bych chtěl pomyslnou kružnici na obrazovce, která popisuje oblast v souřadnicích, převést na intervaly?
Dejme tomu že z kružnice vyplývá je první řada y1 pixelů leží v intervalu Ix1[200,210] a druhá řada y2 leží v intervalu Ix2[195,215], apod.
Napadá mě, že nejdříve potřebuju znát maximální rozměr obrazovky, např. 800x600, abych věděl kolik mám pixelů na ploše, ale nevím jak postupovat dál.
Zřejmě určit střed, počáteční bod. Potom v cyklech zpracovat jednotlivé úhly a zaokrouhlit je?
Offline
Zdravím,
střední řada pixelů procházející středem kružnice bude ležet na intervalu (bude nejširší):
[Xs-round(sqrt(R^2-Y^2)), Xs+round(sqrt(R^2-Y^2))]
přičemž za Y se dosadí nula (tj. střed kružnice - je na souřadnici Ys, jen pro informaci).
Za R se dosadí poloměr kružnice.
Xs je souřadnice středu kružnice.
Postupně za Y budeš dosazovat následující pixel, tj. 1,2,3, .. až R, tím vypočítáš interval X-ové souřadnice směrem dolů po obrazovce. Směr nahoru počítat nemusíš, je symetrický k dolní části.
Offline
Může mi někdo říct co mám špatně na výpočtu souřadnic kruhu?
Kompilovaný soubor ke stažení zde:
http://sourceforge.net/projects/autots/ … e/download
Jde o funkci getXYAxis()
Pří výpočtu dostávám záporné hodnoty!
To co se vám zobrazuje je obsah objektu obj, ve kterém jsou uloženy všechny hodnoty. Jediný způsob jak to vyzkoušet je to spustit.
Tyhle hlášky to píše:
Tedy např. pole obj obsahuje klíč values, pod kterým je pole s položkama radian, sin a cos.. pak je tam klíč xy který obsahuje součadnici x a y
Zdrojový kód:
#include GDI_func.ahk
#include debugObject.ahk
; Initiate arc object
obj := { "values": {"radian":"", "cos":"", "sin":""}, "xy": {"x":"", "y":""} }
imageFile=temp.png
deg2rad(x) {
return % (x*180)/3.1415925635
}
rad2deg(x) {
return % (x*3.1415925635)/180
}
getXYAxis(angle_deg, radius, arr = false)
{
global obj
obj["values"]["radian"] := !arr || arr["values"]["radian"] != "" ? deg2rad(angle_deg) : arr["radian"] ; conversion deg*(M_PI/180);
obj["values"]["cos"] := !arr || arr["values"]["cos"] != "" ? cos(obj["values"]["radian"]) : arr["cos"] ; cosinus always for calculation of width
obj["values"]["sin"] := !arr || arr["values"]["sin"] != "" ? sin(obj["values"]["radian"]) : arr["sin"] ; sinus always for calculation of height
obj["xy"]["x"] := radius * obj["values"]["cos"]
obj["xy"]["y"] := radius * obj["values"]["sin"]
msgBox, % "angle:" . angle_deg . " - " . Array_print(obj)
if arr type array
return % obj["xy"]
else
return % obj
}
diameter := 500
radius := diameter/2
length_1 := 20
length_2 := 20/5
deg := 0
GdipInit() ; Gdip stuff
Gdip1() ; Gdip stuff
pBrush := Gdip_BrushCreateSolid(0xff80D577) ; green A2CD5A lighter 90EE90 between 90D577 and bluish 43CD80
Gdip_FillRectangle(G, pBrush, 0, 0, winw, winh)
pBrush := Gdip_BrushCreateSolid(0xff000000)
;pBrush := Gdip_CreatePen(0xFFFF0000,1) ; transparent?
loop, 71 ; 71*5° = 355 sections of circle
{
deg += 5
obj := getXYAxis(deg, radius) ; // save calculated values for next operations
; The followings are values for lines (spikes) drawn in radix - they are either shorter or longer
xy := mod(deg, 30) == 0 ? getXYAxis(deg, radius + length_1, obj) : getXYAxis(deg, radius + length_2, obj)
;msgBox, change this
; drawline(image, obj["xy"]["x"] + center, obj["xy"]["y"] + center, xy["x"] + center, xy["y"] + center, wheel_color)
;msgBox, to this
Gdip_DrawLine(G, pBrush, 1, 1, 400, 400)
Gdip_DrawLine(G, pBrush, 2, 2, 500, 500)
Gdip_DrawLine(G, pBrush, 3, 3, 500, 500)
Gdip_DrawLine(G, pBrush, 4, 4, 50, 50)
Gdip_DrawLine(G, pBrush, 5, 5, 50, 50)
Gdip_DrawLine(G, pBrush, xy["xy"]["x"] + center, xy["xy"]["y"] + center, xy["xy"]["y"] + center, xy["x"] + center)
}
pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
Gdip_SaveBitmapToFile(pBitmap, imageFile)
Gdip2() ; Gdip stuff
Gdip_DeleteBrush(pBrush)
Gui, Canvas: Destroy
Gui, add, pic, x0 y0 gDrag, %imageFile%
Gui, Add, StatusBar,, Click+shift to view image in viewer
Gui, show, x200 y200 w400 h400,Title
return
drag:
return
#r::
Reload
returnOffline
Nyní ještě řeším jak nakreslit čáry protože umím kreslit jen trojúhelníky, ale s obdelníkama to vypadá takto:
Offline
http://paste.ofcode.org/sdQq3AkK3HUpt8PXiiy476
Co nejjednodušeji:
Je tento vzorec pro výpořet souřadnic správný?
deg2rad(x) {
return % (x*180)/3.1415925635
}
rad2deg(x) {
return % (x*3.1415925635)/180
}
getXYAxis(angle_deg, radius, arr = false)
{
cos := !cos ? cos(deg2rad(angle_deg)) : arr["cos"] ; cosinus always for calculation of width
sin := !sin ? sin(deg2rad(angle_deg)) : arr["sin"] ; sinus always for calculation of height
arr:={"x":x := radius * cos, "y":radius * sin, "sin":sin,"cos":cos}
return % arr
}
Střed: 150,150}
průměr := 200
radius := diameter/2
Počáteční stupeň: (0°)
deg += 5 navyšuje stupně po pěti
Toto mi to vykresluje:
Je to špatně! Mají tam být stupně 0° , 5° , 15° , 20° !
Offline
Tak dík za po pomoc, přišel jsem na to sám,
převod na radiany je
(3.1415925635/180)*x
ne (x/180)*3.1415925635
Offline
↑ buff:
Já myslel, že chceš vykreslit kružnici.
Pro vykreslení kružnice to zkus takto:
winw := 800
winh := 650
diameter := 200
r := diameter/2
x_s := winw/2
y_s := winh/2
t_0 := 0
t_1 := 0
dt := M_PI/180 ;krok-o kolik menime uhel, jaky n-uhelnik kreslime, kdyz je 180-360-ti uhelnik
While (t_0 < 2* M_PI)
{
t_0 := t_1
t_1 := t_0 + dt
x_0 := x_s + Round(r*cos(t_0))
y_0 := y_s - Round(r*sin(t_0))
x_1 := x_s + Round(r*cos(t_1))
y_1 := y_s - Round(r*sin(t_1))
Gdip_DrawLine(G, pBrush,x_0, y_0, x_1, y_1)
}
Offline
vykresloval jsem to jen aby to bylo vidět s jakými hodnotama pracuju. Ty funkce sin a cos pracují jen s radiány, takže jsem to musel ještě převést. Ta funkce co jsem udělal by měla být o něco výkonnější (snad) pokud by to člověk chtěl použít na vykreslení více kružnic nebo na definování více intervalů. Protože pak když máš třeba 20 kružnic vycházejících z jednoho bodu, není třeba opět počítat sinus. Muselo by se to upravit tak, aby se nejdříve vykreslily body pro danou hodnotu sinus a kosinus , tedy s různými poloměry. Byl to takový nápad. Ale pro definici jednoduchého intervalu to je vlastně zbytečně moc složité.
Kladl jsem si otázku kolik míst na výpočet souřadnic vlastně potřebuju. Určitě to záleží na poloměru.
Napadlo mě udělat dva intervaly. Jeden základní který bude popisovat body pro zahrnutí a druhý interval vnitřní, tj. vnitřní kružnice, popisující body které nemají být zahrnuty. To pro případ, že kružnice není vyplněná barvou... Ale je to jen obvod.
Offline
↑ buff:
Ty si fakt myslíš, že je rozdíl mezi:
a 
Po editaci:
Pokud cheš počítat sinus a kosinus jenom jednou, pak úprava programu
winw := 800
winh := 650
diameter := 200
r := diameter/2
x_s := winw/2
y_s := winh/2
x_1 := x_s+r
y_1 := y_s
t := 0
dt := M_PI/180 ;krok-o kolik menime uhel, jaky n-uhelnik kreslime, kdyz je 180-360-ti uhelnik
While (t < 2* M_PI)
{
x_0 := x_1
y_0 := y_1
t := t + dt
x_1 := x_s + Round(r*cos(t))
y_1 := y_s - Round(r*sin(t))
Gdip_DrawLine(G, pBrush,x_0, y_0, x_1, y_1)
}
Offline
Hele, já ten algoritmus musel opravit, jinak mi to prostě nejelo správně.
Offline
↑ buff:
buffe s tebou je to těžké.
Ty vzorečky, pro převod stupňů na radiány, co jsi napsal v příspěvku 6 jsou stejné.
Ty jsi ovšem v jiném vláku (střední škola) napsal ten převod opravdu obráceně. Tedy
(x*180)/3.1415925635 což je samozřejmě převod radiánů na stupně.
Offline
Není to jedno? Hlavně že mi funguje program (vykreslení "kružnice"). Začínám se teď učit další programovací jazyk; zjistil jsem, že skriptovací jazyk ve kterém píšu některé věci s grafikou prostě nezvládne dost rychle, takže se učím C++. Bude to asi ještě běh na delší trať než dokončím co jsem nedávno začal.
Offline