Seminarska naloga 12.7: Izris 3D zobnika

Avtor, Marko Kljun

RPK, 2000

Mentor, Janez Krek


Kazalo:

  1. Abstract
  2. Definicija programa
  3. Opis programa
  4. Teoretične osnove
  5. Zaključek
  6. Literatura

Abstract#

The program calculates points of a involute gear (pinion) and draws them on to the screen with a help of a PHIGS graphic library. A user must provide some basic parameters of the gear to the program. These parameters are (standard) module, number of teeth, diameter, thickness, ... The program allows exporting of points into the DXF or the VRML file. The source code of the program is written in JavaScript.


Definicija naloge#

Program služi za izris zobnika v 3D prostoru. Vhodni podatki so: modul (standardni), število zob, širina zobnika, širina kolesa, debelina venca in premer izvrtine (za gred). Program omogoča zapis modela v DXF in VRML datoteko s ploskvami ali telesi (možnost izbire izhodnega formata). Program je izdelan s skriptnim jezikom JavaScript (izris s pomočjo PHIGS knjižnice).


Opis naloge#

V nalogi je potrebno sestaviti celoten program, ki omogoča izpolnjevanje zahtev iz definicije naloge. Program je sestavljen iz posameznih vnosnih polj za parametre in spletnega programčka (appleta), ki omogoča izris točk na ekran. Postopek izrisa se začne z branjem vnešenih podatkov iz vnosnih oken v sam program. Ob vnosu podatka in s klikom izven tega polja, lahko s klikom na gumb "Draw-Center view", preberemo podatke v programske spremenljivke in izrišemo zobnik. Če posamezen podatek spremenimo, je ta sprememba pravtako upoštevana pri izrisu. Ker je pri obliki tega evolventnega zoba pomembna standardna oblika, so tudi uporabljeni moduli standardni. Izbira standardnega modula poteka iz padajočega seznama. Če modul ni standarden, to pomeni, da se je izračunal ob vnosu premera in števila zob, hkrati pa se kot obvestilo pojavi napis, da modul ni standarden. Same osnovne enačbe zobnika in njihove definicije so vidne na tebelah 1 do 5 in sliki 1 (a,b).

Tabele

Slika 1.a
Slika 1.a

Slika 1.b
Slika 1.b

Tako so v prvem delu okna programa vnosna polja za: izbiro modula, delilni krog, širino zobnika, premer izvrtine zobnika, v naslednjem delu okna pa polja, v katera se izpisujejo parametri pomembni za izračun zobnika, razdelek in kot delitve ter število zob in kot zobnika (privzeto 20). Ostala vnosna polja pa se uporabijo za vpis parametra, ki vpliva na natančnost izrisa evolvente in samih lokov, ter enote. Za začetek izrisa je potrebno klikniti na gumb "Draw-Center view", ki izriše s parametri določen zobnik. Zobnik je tako centriran na sredino grafičnega polja, ki je po oseh veliko toliko, kot je vrednost v oknu "Units:". Če uporabim za izris gumb "Draw_man", moram narisan objekt najprej zoomirati, če ga želim opazovati v oknu. Vrednost v polje "-ZOOM-" vnesem takšno, kot je v polju enot, ki zobnik prikažejo. Ta gumb je uporaben za izris točk, ki jih izvozim v VRML ali DXF v merilu 1:1. Če za kliknem na gumb "Cross", pa se na zaslonu pojavi obvestilo o glavnih vrednostih parametrov zobnika, poleg tega pa se v grafično okno izrišejo še koordinatne osi. Za izvoz datoteke je potrebno klikniti na gumb "VRML" ali "DXF", pač odvisno of formata izvoza. V novo nastalo okno se izpišejo podatki potrebni za datoteko, ki jih bodisi shranimo z ukazom "Save as" iz menuja "File", ali pa besedilo okna kopiramo v novo, prazno datoteko, ki ima končnico pripadajočo izvoznemu formatu. Nova okna zapiramo s klikom na gumb, s katerim smo jih odprli.


Teoretične osnove#

O programu#

S klikom na gumb "Program", se zažene povezava na datoteko seminar_10.html. Datoteka vsebuje tako HTML kot tudi JavaScript programsko kodo. Ob zagonu se pojavi delovno okno programa. Sam program je sestavljen iz več logičnih delov. HTML koda skrbi za vizualni prikaz programa, skriptna koda pa nadzira vsa dogajanja v programu. Sam program se začne izvajati v vnosnem polju, ki mora biti izpolnjeno, če želim uporabiti navedene parametre. Za branje spremenljivk JavaScipta uporabim dogodke (Events), ki kličejo funkcije branja parametrov (read_para1() in read_para2()), pač odvisno, ali uporabljam standardne module ali pa izbiram število zob za določen premer. Vsa polja imajo prednastavljene vrednosti. Če želim določeno vrednost spremeniti, kliknem v polje te vrednosti in vpišem novo vrednost. S klikom miške izven tega polja (na drugo vnosno polje, gumb ali prazen prostor), se pokliče branje parametrov. Za vsako spremembo se berejo vsi parametri znova, saj samo branje ni počasno, tako da je klic nove funkcije za vsako spremenljivko posebaj nepotreben. Torej pred prvim izrisom je obvezno potrebno klikniti v eno polje, da se parametri preberejo. Hkrati se ob branju parametrov izračunavajo tudi ostale spremenljivke, ki se vpisujejo v ostala prosta vnosna polja. Ob uporabi nestandardnega modula z vpisom števila zob, se pojavi obvestilo o nestandardnosti. Hkrati se v izbirno polje modulov doda ta novo izračunan nestandarden modul.

Izris programa sledi s klikom na gumb "Draw-Center view". S tem se izriše ustrezen zobnik na sredino grafičnega polja.

Matematično ozadje#

V HTML kodo je vključen programček (JAVA applet), ki nadzira izris v okno. To je ob skriptni kodi datoteke Phigs.js PHIGS grafična knjižnica. Knjižnica zahteva strukturo urejeno po neki shemi. Najprej je potrebno podati nekaj parametrov, ki inicializirajo knjižnico za začetek izrisa. Po izrisu pa lahko pokličemo ukaze za zaprtje le te. Te parametri so zapisani v funkciji main(). Izračun točk zobnika se začne s klicem funkcije objectCalc().

S to funkcijo se začne uporaba matematike. Najprej je potrebno določiti imena točk za ustreznost PHIGS knjižnici. To naredim z ukazom

	points[0][i]=new Ppoint();
nato pa lahko začnem z izračunavanjem posameznih koordinat točk po naslednjem načinu, kjer točke s sklicevanjem na points.x ali points.y prirejam za vsako koordinato posebaj.
	points[0][i].x=db/2*(Math.sin(tau)-tau*Math.cos(tau));
	points[0][i].y=db/2*(Math.cos(tau)+tau*Math.sin(tau));

Z izrisom zobnika začnem iz točke 1 na vznožnem valju, kot je vidno na sliki 2.

Slika 2

Slika 2

Iz te točke nadaljujem na točko 2, ki predstavlja začetek evolvente na osnovnem valju. Od tu naprej izračunavam točke na evolventi po naslednjih enačbah.

Enačbe 1

Ko pridem s parametrom tau do mejne vrednosti, torej ko je r enak da, zaključim z izračunavanjem evolvente. Sedaj moram izračunati mejni kot, iz katerega začnem risanje evolvente v nasprotni smeri, med vrhoma evolvente pa izračunam lok radija polovice temenskega valja. Enačbe izračuna parametrov povratne evolvente so naslednje.

Enačbe 2

Sedaj dodam tudi lok od začetka nasprotne evolvente do kota, ki ustreza delitvi. S tem narišem prvi razdelek zobnika. Sedaj s funkcijo rot_obj(gr, z, 0) kopiram te odseke v nove točke, ki si sledijo zaporedoma po obodu celotnega zobnika. S tem je izračun točk zobnika končan.

Sedaj je potrebno vse točke povezati za uporabo z grafično knjižnico. Postopek je sledeč.

	var GearPts = new Array();
	for(var i=0; i>points[0].length; i++)
	{
		GearPts[i] = new Ppoint(points[0][i].x, points[0][i].y);
	};
	var GearData  = new Ppoint_list(GearPts.length, GearPts);
	pset_line_colr_ind(2);
	ppolyline(GearData);
Najprej ustvarim polje GearPts, ki vsebuje urejene pare točk celotnega zobnika. V lokalno spremenljivko GearData ustvarim nov izvod predmeta Ppoint_list(), ki vsebuje kot parametra število točk in ime polja, ki hrani točke. V naslednji vrstici se s cifro (0-4) nastavi barva, ki se uporabi za izris točk. Z ukazom ppolyline(GearData) pa povežem vse točke v polilinijo. Vsi ti ukazi so osnovni ukazi PHIGS knjižnice. S tem imam narisan zobnik brez luknje. Za izris luknje uporabim enak postopek, le da izračunavam točke za krog s funkcijo radius(...).

S takim primerom izrisa bi imel določene točke, ki bi bile po grafičnem polju raztresene preveč narazen, da bi lahko videl celloten zobnik. Grafično polje je določeno tako, da ima spodnji lefi kot koordinate (0,0), zgornji desni pa (1,1). S tem so vse točke, ki niso v tem območju "narisane" na odseku, ki ga ne morem videti. Zato je potrebno te točke najprej popraviti tako, da bodo vidne vse. To storim s funkcijami transformacije.

Transformacijo pokličem s funkcijo transform(rotate, tranX, tranY, scal). Posamezne parametre odčitam iz polj, ki se nahajajo pri gumbih za skaliranje, rotacijo in translacijo. Translacija poteka tako, da vrednost iz polja delim z units, to vrednost pa v zanki prištevam vsem točkam. Skaliranje poteka okoli točke (0,0), pri čemer koordinate točk samo pomnožim z vrednostjo iz polja. Tako se mi vse koordinate spremenijo za nek faktor. Rotacija pa poteka po načinu, ki je predstavljen na sliki 3.

Slika 3

Slika 3

Ko opravim vse te transformacije, lahko ponovno sestavim točke v polilinijo za PHIGS. Enačbe transformacije so naslednje.S tem končam tudi transformacijo.

Enačbe 3

Za izvoz datoteke pa skrbita gumba DXF (Data eXchange File) in VRML (Virtual Reality Modeling Language), ki izpisujeta izračunane točke po sistemu, kot ga zahteva sam jezik. Tu narisanim točkam dodam še novo "z" (tretjo) koordinato. Te točke predstavljajo sedaj eno stran zobnika. Če želim da je zobnik tridimenzionalen, mu moram dodati še en enak set točk, le da so le te premaknjene po z koordinati za širino zobnika.

Ob kliku na gumb VRML se pokliče funkcija za izpis v novo, programsko ustvarjeno okno. Okno odprem z ukazom window.open(), vanj pa nato izpisujem parametre, ki so potrebni za VRML kodo s fukncijo writeln(). Točke izpisujem v zanki od prve do zadnje, nato pa jih povežem med seboj. Najprej določim ime elementa, material in barvo le tega. Po ukazu "Coordinate3 {point [" začnem z naštevanjem točk. Po izpisu le teh pa določim povezave med njimi z ukazom "IndexedFaceSet {coordIndex [", kjer naštevam indekse posameznih točk. Posamezne ploskve, ki so samostojne enote, ločim z indeksom -1. Podroben opis samega standarda je dosegljiv tukaj.

Podobno kot izvoz VRML datoteke poteka tudi izvoz DXF datoteke. Struktura datoteke je dokaj obsežna, podroben opis samega standarda pa je možen tukaj. Sama datoteka je razdeljena na 4 dele, ki so "HEADER", "TABLES", "BLOCKS" in "ENTITIES". Prvi trije deli za sam izris niso nujno potrebni, saj ne hranijo samih točk, temveč nekakšne programske parametre. Izvoz v DXF format je možen na dva načina: s potrditvijo v pogovornem oknu za mrežni model in z zanikanjem za "3DFACE" model.

Samega okna sedaj ne morem shraniti na serverju in si ga od tam ogledati, temveč moram vsebino okna shraniti v novo datoteko s končnico *.vrml ali *.wrl oz. *.dxf. To storim z ukazom File/Save as... ali pa celotno vsebino okna (CTRL-A) preko odložišča skopiram (CTRL-C) v novo textovno datoteko (tekstovni editor).


Zaključek#

V vaji je bilo potrebno izdelati program za izris 3D evolventnega zobnika. Za izris se potrebuje ogromno matematike in tudi poznavanje osnov programiranja s programskim skriptnim jezikom JavaScript in uporabo HTML sintakse, kot osnovo za večpredstavno stran. Iz osnov poznavanja jezikov je bilo potrebno ustvariti program, ki ni namenjen samo prikazovanju, ampak tudi za nadaljno uporabo, ker je izris zobnika dokaj hiter in popolnoma sledi podanim parametrom. Poleg tega pa program vsebino 2D upodobi v samem programu, izvožene 3D slike pa so v formatu DXF ali VRML, ki pa jih berejo (skoraj) vsi programi za CAD/CAM delo (npr. AutoCad). V programu sem se trudil delati strukturo na način, ki bi omogočal čim hitrejše delo. Program bi ob majhnih spremembah dovoljeval veliko več grafičnih elementov na zaslonu, saj so vse transformacije in ostale funkcije narejene tako, da lahko delajo tudi na drugih elementih. Sam program je postal precej bolj zahteven z dodatkom, ki omogoča spreminjanje natančnosti risanja elementov.

Vaja je izredno poučna in zanimiva, je pa prav zaradi teh dveh lastnosti precej obsežna.


Literatura#

1. Mesojedec Uroš : Java, Programiranje za Internet
2. Kraut Bojan : Strojniški priročnik
3. Prebil Ivan : Tehnična dokumentacija