Matematické Fórum

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

#1 27. 08. 2013 08:46 — Editoval buff (27. 08. 2013 09:09)

buff
Příspěvky: 213
Škola: ZŠ
Reputace:   
Web
 

Jak převést obvod kručnice na intervaly?

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?


Dobré na ukládání dokumentů, aby byly přístupné ke čtené online *.doc, *.rtf aj. http://www.viewdocsonline.com

Offline

 

#2 27. 08. 2013 16:04

mák
Místo: Vesmír, Galaxie MD
Příspěvky: 920
Reputace:   63 
 

Re: Jak převést obvod kručnice na intervaly?

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.


LibreOffice Verze: 25.8.4.2, Maxima 5.49.0 (SBCL)

Offline

 

#3 27. 08. 2013 16:21 — Editoval buff (27. 08. 2013 16:30)

buff
Příspěvky: 213
Škola: ZŠ
Reputace:   
Web
 

Re: Jak převést obvod kručnice na intervaly?

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:
http://oi44.tinypic.com/dz7yja.jpg
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:

Code:

#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
return

Dobré na ukládání dokumentů, aby byly přístupné ke čtené online *.doc, *.rtf aj. http://www.viewdocsonline.com

Offline

 

#4 27. 08. 2013 18:19

buff
Příspěvky: 213
Škola: ZŠ
Reputace:   
Web
 

Re: Jak převést obvod kručnice na intervaly?

Nyní ještě řeším jak nakreslit čáry protože umím kreslit jen trojúhelníky, ale s obdelníkama to vypadá takto:

http://oi41.tinypic.com/2lv1fsn.jpg


Dobré na ukládání dokumentů, aby byly přístupné ke čtené online *.doc, *.rtf aj. http://www.viewdocsonline.com

Offline

 

#5 28. 08. 2013 07:50 — Editoval buff (28. 08. 2013 08:01)

buff
Příspěvky: 213
Škola: ZŠ
Reputace:   
Web
 

Re: Jak převést obvod kručnice na intervaly?

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:

http://oi44.tinypic.com/331zlz6.jpg

Je to špatně! Mají tam být stupně 0° , 5° , 15° , 20°  !


Dobré na ukládání dokumentů, aby byly přístupné ke čtené online *.doc, *.rtf aj. http://www.viewdocsonline.com

Offline

 

#6 28. 08. 2013 08:47

buff
Příspěvky: 213
Škola: ZŠ
Reputace:   
Web
 

Re: Jak převést obvod kručnice na intervaly?

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


Dobré na ukládání dokumentů, aby byly přístupné ke čtené online *.doc, *.rtf aj. http://www.viewdocsonline.com

Offline

 

#7 28. 08. 2013 09:13 — Editoval Honzc (28. 08. 2013 09:25)

Honzc
Příspěvky: 4641
Reputace:   248 
 

Re: Jak převést obvod kručnice na intervaly?

↑ 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

 

#8 28. 08. 2013 09:35

buff
Příspěvky: 213
Škola: ZŠ
Reputace:   
Web
 

Re: Jak převést obvod kručnice na intervaly?

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.


Dobré na ukládání dokumentů, aby byly přístupné ke čtené online *.doc, *.rtf aj. http://www.viewdocsonline.com

Offline

 

#9 28. 08. 2013 10:04 — Editoval Honzc (28. 08. 2013 10:46)

Honzc
Příspěvky: 4641
Reputace:   248 
 

Re: Jak převést obvod kručnice na intervaly?

↑ buff:
Ty si fakt myslíš, že je rozdíl mezi:
$\frac{\pi }{180}\cdot x$  a $\frac{x}{180}\cdot \pi $
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

 

#10 28. 08. 2013 10:46

buff
Příspěvky: 213
Škola: ZŠ
Reputace:   
Web
 

Re: Jak převést obvod kručnice na intervaly?

Hele, já ten algoritmus musel opravit, jinak mi to prostě nejelo správně.


Dobré na ukládání dokumentů, aby byly přístupné ke čtené online *.doc, *.rtf aj. http://www.viewdocsonline.com

Offline

 

#11 28. 08. 2013 11:28

Honzc
Příspěvky: 4641
Reputace:   248 
 

Re: Jak převést obvod kručnice na intervaly?

↑ 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

 

#12 30. 08. 2013 13:33

buff
Příspěvky: 213
Škola: ZŠ
Reputace:   
Web
 

Re: Jak převést obvod kručnice na intervaly?

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.


Dobré na ukládání dokumentů, aby byly přístupné ke čtené online *.doc, *.rtf aj. http://www.viewdocsonline.com

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson