From 6435f717838bf54f413f393e5fde05fbadf70c69 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 16 Jul 2021 14:08:53 +0300 Subject: [PATCH 01/37] Update README.md --- demo/gdml/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/demo/gdml/README.md b/demo/gdml/README.md index 6ad546f1..5c2a5abe 100644 --- a/demo/gdml/README.md +++ b/demo/gdml/README.md @@ -1,12 +1,10 @@ - ### GDML Example Visualization example for geometry defined as GDML file. ##### Building project -To build the app, run `demo/gdml/Tasks/distribution/jsBrowserDistribution` Gradle task, then open -`demo/gdml/build/distribuions/gdml-js-0.1.3-dev/index.html` file in your browser, and +To build the app, run `demo/gdml/Tasks/kotlin browser/jsBrowserDistribution` Gradle task, then drag-and-drop GDML file to the window to see visualization. For an example file, you can use `demo/gdml/src/jsMain/resources/cubes.gdml`. From bdb28eb338f8b4cfcd300b558c70456aa4afc118 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 16 Jul 2021 14:10:09 +0300 Subject: [PATCH 02/37] Update README.md --- demo/muon-monitor/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/demo/muon-monitor/README.md b/demo/muon-monitor/README.md index 87b3cf43..df95c968 100644 --- a/demo/muon-monitor/README.md +++ b/demo/muon-monitor/README.md @@ -26,9 +26,8 @@ with it. ##### Building project To run full-stack Muon Monitor Visualization application (both JVM server and Web browser front-end), -run `demo/muon-monitor/application/run` task. +run `demo/muon-monitor/Tasks/application/run` task. ##### Example view: ![](../../docs/images/muon-monitor.png) - From eb3786c5ca8ff2f9b084a8564a10e8037572e3f9 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 14:49:13 +0300 Subject: [PATCH 03/37] Add files via upload --- docs/images/all-solids.png | Bin 0 -> 8107 bytes docs/images/big rotated box.png | Bin 0 -> 2206 bytes docs/images/box.png | Bin 0 -> 1326 bytes docs/images/classic-hexagon.png | Bin 0 -> 2441 bytes docs/images/cone-1.png | Bin 0 -> 2768 bytes docs/images/cone-2.png | Bin 0 -> 2508 bytes docs/images/cone-surface-1.png | Bin 0 -> 9500 bytes docs/images/cone-surface-2.png | Bin 0 -> 4938 bytes docs/images/custom-hexagon.png | Bin 0 -> 2190 bytes docs/images/high-box.png | Bin 0 -> 1756 bytes docs/images/small box.png | Bin 0 -> 1503 bytes docs/images/sphere.png | Bin 0 -> 2446 bytes docs/images/two-boxes-1.png | Bin 0 -> 2353 bytes docs/images/two-boxes-2.png | Bin 0 -> 3021 bytes docs/images/wide-box.png | Bin 0 -> 1584 bytes 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/all-solids.png create mode 100644 docs/images/big rotated box.png create mode 100644 docs/images/box.png create mode 100644 docs/images/classic-hexagon.png create mode 100644 docs/images/cone-1.png create mode 100644 docs/images/cone-2.png create mode 100644 docs/images/cone-surface-1.png create mode 100644 docs/images/cone-surface-2.png create mode 100644 docs/images/custom-hexagon.png create mode 100644 docs/images/high-box.png create mode 100644 docs/images/small box.png create mode 100644 docs/images/sphere.png create mode 100644 docs/images/two-boxes-1.png create mode 100644 docs/images/two-boxes-2.png create mode 100644 docs/images/wide-box.png diff --git a/docs/images/all-solids.png b/docs/images/all-solids.png new file mode 100644 index 0000000000000000000000000000000000000000..9be7b40e27239d75efd5723cc819ad94fca8d636 GIT binary patch literal 8107 zcmeHMS6EYBvkr&~A|M^E1tPtdP*3pt&+}iLt8;Pg&c%NAvu3S#X3smb*P6X2`k9Uf)eY7g004kW6Rf5W z0FX)m03=%Eq(n&^X6N!o;-#zEnDJNNCPj!;{B&mLg

5EP-~cCAB_64ZGIsfF6J4xv5Mb9SG8p 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 literal 0 HcmV?d00001 diff --git a/docs/images/big rotated box.png b/docs/images/big rotated box.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7cdc14dad92f2d151a2fbf735e3af14b4f54e4 GIT binary patch literal 2206 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1$kV^0^ykczmschBYqM@lq2Oqr%5Xu82I zq`^fr#6Wbz0w(=sOj--LRJ1xGE;D6J+dOafL!l4;Z;m`}`7LMPud~CPF;Q%f)$`9A zcgDol?q$&Uk^E0G;Uf$82>~4i=M4=!2bqjUIiq1fK|0t0OjvXE6(8L_o&NbM|LWEG zpGBR8b*80SyNT!TJ0ott=ile~KVR9)-?xw4TWfXSz~tbgiElJ6J_+b~m&A4LX!~=q z$mb3lEE<)kxvH1QuE`9~m{`ij(p@W;7g^%eRBFf4J%8QjEpm(RM=#nvBkSv5&$^ng zht?HT^qFo*`*r;P>*Rl0I?V|i)1sE23Ac=v4n3wE!IKol|8Cw6Ljh3g?k;`VJ2m#< z3m`*&-g$9WbA7=gHJ0u|iDX{?4HDh44==EEo36L7<(r?AP||dC+9#!>>k4w3SW`H} zqLuVT?)?&4Xn1W0OZUYaqI^D}9Fycy*4iwjV`h2tKoX}Iv(YiBsRRzhto(O5zhe2!uW*XJu35#ytrjsy*!|vPU<4ogQSe>5thKbs z_0ryB5y8dza-XMX6s>9Wz3skH?m4g3_tN4W4-?wzYX4o6-b!FZXM#Ot{J^Hrr2njqtkuZFjdvUY@*B-bYx+ zY;X0?H`hDfa9%qo;rq|OpHFB_v2sMtEskqXwi(!F^t^i%cW{%uOhYp7os(CVy*>VC z@BQ>uSEnre*=DQ|F^BiP)hnPGYuD|I+_u4|>1gB*xdh4W-#NwD-&9U5;OyCWt}9_< zcOiebO2iy?PPwK8M#(1Edj}1tb^bPB>6V?7lQ5H|+c=@Ylnb051>Z;}OD6QXY}nD7 zD*}pbze-3n8+Oc1)?r?AkV9;@W!F(APBCZW15(`}(~iE)Iz749a2n&a3UFzCEVaQ@ z=3tVBond88)6un;)TMbgv_Vpu2J;$0PO-&?$E0Q?Y@A-o<*gLabMi>7$Mn^!*MC;c zsr>%w=9kAz|DQiU>wEu~SHM~~)rdErcQs%txZJ>+-Opd^0I?5UNFgSAb=zitK XkKfnK-t`&SreN@N^>bP0l+XkK2=+1# literal 0 HcmV?d00001 diff --git a/docs/images/box.png b/docs/images/box.png new file mode 100644 index 0000000000000000000000000000000000000000..6824b2d3584dfcf81d66b99a22136f3fcbc5f5e0 GIT binary patch literal 1326 zcmeAS@N?(olHy`uVBq!ia0y~yVAKR+Mh+&R$ZD1&eL#w_ILO_JVcj{Imp~3nx}&cn z1H;CC?mvmFKt5-IM`SSr1K(i~W;~w1A_b`Cu&0Y-NJZS+TaI1Q**vWm@6~Rb`m;Gl zrQ3tYw(`W&&ezlPQuyW+nm7Fp41KU(et#YF=Pm4#x0-q0I<|dNaIT)P(DuXyxs(ik zqv0cbZ_E1i_VsoD%I`mZ@1qr7F#p>!+p-v~sD&{HYj4dCGu!LBv+4I1^R+ou-9@b5 zGxM)p5MV!qs`a&8fyd1k)f z%uiNNW%4fFoA6eD4!_;cb3oRn$Guz1r+sUiBC8+T_lWPU?~exYbNNs8-d(uI^7f-o zweYE?@1IVVPxyAL_Kfp;$7=S>^>e@NShBY)b>Ho&uPbJMtE#=^{65-p!uHJd*B9@# zKK1TD>r;n&%l5{Z|NdFu{=ctC`TfPX^~Zy}{cdNz7kT^jlHB@?_1B+o4d;83d+YU5 z+qjEy`fopW0nLf1w)@6+DNg@9LM*dCe9Lw3>OG70#@%`>`gW`K?Yrw@j^EyLeO*rZ z?jqUz%W=Cm-FVYCp&Ng8URa^L^GWYY(6)HQ|@Cmg|1iF_)kcTaK%~-Fg`& zc&}yCgT1F>?=0NQnR>8#>h2xR;2_p2FKqv&Hih+l=sQp(XmH29I-P&2@6x>%qen|Y z5u`RnP=D#(&0EYD_Ec!Tox2pM{fKwwdmW%!FY?yx z4-vUHKe~a1wj4Kp>w7`&{1$V^YMaZ@n6+EHw@3t-EDo`6dA_iG&NsD+cc2JIQ=8Pk qM1AW2bH2knnXuIbq#@K9D}E;pUXO@geCy=go(BQ literal 0 HcmV?d00001 diff --git a/docs/images/classic-hexagon.png b/docs/images/classic-hexagon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0053ae405957afb0c4b4ee6f356b34cdad147e8 GIT binary patch literal 2441 zcmeHJ`(G2+5)Y+R(I_gB3k4F{-XJRfdXTEdh%*>h3 znVAA%Ab-<_w>Qvev`v1#KEX7aiI$?6^>0uJZ(Kh?EheeK{6n<5e!Jf&=FJn{0p2uP zy?oC;lC;5h@(rBAI*T|$h@hb_1G5vhJkDQ8nq74Yw`da6T9=bmB|186+_u_cH z;u-S?gT-5PtEM9#{_py}6X!S%7R)>CMxU}{QP~Gfw)}EyF@)AsL(sSkn;p4;={2F` z3gUQ*Djm9K`*x6P!n!)b|dbDgy^gfTjN;${^-d(rfdS3>BoJW98|{{#I9fiMQs)Np8xOaK2HJ z^X4&;&z?`&D21MLA*W)EPzlWE zXc3D4g1h!zCoJGrGZ??hkcD_opReOW?^0*Z0rN#TeKlBT|1-Ns3f0yS%3p`EXnSOW z(_A=5N*sj}6vCp-kO^nFbsvoXz>qzlwA(?b_BdNiSt!Bj_9DrgHHXsHgN9c!^}6qb zI)|3Xp*XfUf30fhM8%pkT%)WYOp}FqNvI%B3XKIQx~J1kGz^;_9u~$|T!>{K-ia_3 z{L|ZUO>G5nJBHmE#E=Q4DToyMfD3KHHM>4gbnCYsqxeG5Ffit_0|f>t<8GkgAt@oK zgl&z3ZQ84e1oeF6-G8CvSuNr$h2%m>Q!Kml1WMv~L?KR&Gw=-N@AsM*Hgho6DhCz| zaJp@<3HYlj9@vHTQulf*j5z=FKptSJ5lDSeGLn>hbWq_J$A+26Oce8X z?~^ELI_9zg#*6}mM#_e_Au~K_O0*PWfsn<=_LMKtAe7K2m?;7pb8xyV2$haxDElOr z7DSlGJ0t5fHU-XHUe@Di>EG}dw5WT3lMTcbxsDSt6 z{|z`9NTvKcd0bZnDPR@@;;6!R@^F&Lg}$}!?Zq|K!4k)BJXC#>biU&2y6Mn~WM!Yu zfeSg`k;mP5!R&UMTe!q4p1m?WIeTS59sM#u+f;G51I_B(WPhOk_NmZ4&`q1($xLlm ziYH`?_m#|FLuO8Pz{V$-Up@{(woa+)hxJ6a)kYqR3u&ETl?U2jm3kh)s_usN%NwlV zUd$`lZeN=3TwwVh_Sv_8JE4q~ju7gwH1+xtO*$__EIH)t8RN4(tWb6tz&@S|4a{$_ zYRm_)r&BJ8p}N?7PB;mn0v6LF=C-^+Brrz>ZcN+WzN*?TWi|2X%tZZI1raWYM+MnW z?R%e7@K7c3Y;M+N7;LZ-W58fD>youuH3iRRiw2ty0~VuRx(3y+OXaTs_nJMncxj7F z9qNfqI=-jgT}?dhS>j*hSD#L(-!fQs!>q00MSk*1<7P%e*Zb1)x^9CU9(7@#DI)iK z?NU97i5Vdtk1bnv+*(5~0&vcwN%cSsz=f*!@{PWQnrl=i^&B<*r=$LDV+B1Z=(Xuj X;;z)pKD+-=;}gvf3G}Hubo|_(N0#&X literal 0 HcmV?d00001 diff --git a/docs/images/cone-1.png b/docs/images/cone-1.png new file mode 100644 index 0000000000000000000000000000000000000000..47272f2426381cb736f7d13fbafdf14cbb909c25 GIT binary patch literal 2768 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 Si|`*9;iS8dTb1kIQ~nEkMU{F0 literal 0 HcmV?d00001 diff --git a/docs/images/cone-surface-1.png b/docs/images/cone-surface-1.png new file mode 100644 index 0000000000000000000000000000000000000000..dad20dda54bc82b5068da45f40c92764bf1beb1e GIT binary patch literal 9500 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 literal 0 HcmV?d00001 diff --git a/docs/images/high-box.png b/docs/images/high-box.png new file mode 100644 index 0000000000000000000000000000000000000000..a3da538425823ef7ad168954968732d62f42c170 GIT binary patch literal 1756 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 literal 0 HcmV?d00001 diff --git a/docs/images/two-boxes-2.png b/docs/images/two-boxes-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8acaaea5db1c38644075bca966177097715bc7c3 GIT binary patch literal 3021 zcmeHJ`B&2E8b_nl!KKB)HLS_Ba%nVCZ@IK+nrm5KKvYCaQb;o`l`NbKk=;u!dEJey zDNr`S2yM*ekdbFpv{E!Rwc|`W;ZlmEqTt2(AMUxo^uu%B_jx|gd7kGy=Y2ot^RLrk z0Y*Pq{s01jj7|mmMSws$g&U@?tBsh9KC03lI_VJs$3b;H)}OTw_~Nn9V<1p{0c0(1 zv(`6A4U9|&fsETXOsC^=?FA4B5`W6?*tsms?5H&F145VjcEGX4bjI`kUP6kM-9cg@%qrMCj`Hke~12u+ejRKG3Z;?s3GSr zO{k}QS2G{&jj0(UIelqfSz6aDt7~cs_+vSm%W9;TBZM}2l_PI&^r&tvJ|`oXf%Um>dghO?iEH2`>I3F`24nZ!2Xrq zg}5tL9SGUS_szozcyCJxjTh6vHg*-k@~D!Go;tR;m?-M%zrGa;jY6dYJ1^k9^~Lcq zgc|&5SlcRwXELrL%-!3wn@~XlSyyDktoOHlSi+AwKxm(m|E@DvPL;%~q5{o$Y;lPK zU&gwY1Ey_`zM&dv#0uC8zi4#lQ#`k)m5e;lF!zOXz1m6YZ9Ok1(qh=9m=n{~UW0jK z6e_xQ#L*^JJ)b0D-Fy&p_lF{bMU;Na7CQ{tOU#44CZ47;xvfER{1L2Xgo+8gtkLx)%L(0SdQ z7$!mprd8N!;h=(un$p4Aq`O%E>r1M#am;#zrm=0Tb5YyGSM+NoP`oZ=BF?UTO)rY5 zZBu3DWX&%=8?uQv#J)dPC6gcs>Axvl)u$3*rS)I!CUKjK6OR8Eh@! zt7r(Bi~0OHn_E~>o!j)K26>y)W#xYc)0D*2nb|?~EzMIGI52AQZK=9>CUy_lpzbhJ;5{3Mof?CPV}{I4wx)4 ztYY9#SHWGP%p3|XWBj)|8vo-e?1LvjQB^%iEF~&E!L)j{0z2wCQiC7-jEi}^*wY-e z8+G6HiM&C?#tTmlrSa8|^r6|U)p}JyvWGs^7o|-Lvdh+69_vGU`xRIUYgoyRM4Hxk z-659v3(Pqp`9U;Lb!~PwLvbJvJ0H^MdA#*50mupARdjRw$P(0wt8*8lEfGaW_U7jb z%aQ*C(>CFS&ai`4(*?Qd4|qiFKlkL`@NQdICJ3dLqb&!dl^&vQP6%1D-^qh8{t8!t z{0&Sy)P#d)1QXo&8KH+^mB@N9O)-&@L@!5A0&e2?qKu6@@VuZb@r?6 zj?Vo($;-l^&;4>AeJFBhrgR`d!9HSe{n*eORrb0NC6gz7@i>~dkO|65SLU_HI1?SW(GU~BRh}H5yuDxsNkU^gz2H>$W%Spt8=tkdovuE=OD_`T7Pp+TYpQk7Y0POomvSFI^`ecS9css{x8^t1#JKT literal 0 HcmV?d00001 diff --git a/docs/images/wide-box.png b/docs/images/wide-box.png new file mode 100644 index 0000000000000000000000000000000000000000..762a76ac171c1282778b4f99e83f0b6406c26369 GIT binary patch literal 1584 zcmeAS@N?(olHy`uVBq!ia0y~yUM1MG6B0>rqb^$B>G+w|8QLq^(6-1JmZ;OjVLR z!W+|lEN}tyva8FN?)6*Co>P}If6~6`Ax~c(KOgU4B-&7-#qctO;nGTmCBcjy%b6zl zu`0~vaw^DZzxiC*Q~ND1nP({z>#dppzvpa!WOn=T+nJ`%-t#YIS{~HM^mavk z_O{u@yKU|setrI*bXa5XN{7a>EAGDKySKI9HV*y#vwRU$p}0>u|L*qYXN}VXpsLoJ z-j1!k9{${V|8EdsyjZzp3jNm^yWjouI}ogI zt5(5mW&6PGdTyIPGHGqFzq?D~>@n^Y2mY13PBM|!U%>SH^4ji;IeQwo-uMrMBB{4~ z)*EXX7)r0dc<#4VaRTd~^5pd3Mya<4z`~*{F7o}cTFfL&nUKB_yV`@wkOw(h0gGjS zxVo`ETgGI1t1&($Bq5Jp})HKQ1`oNAD7Xhgp|_t_WAhzjBAg)*=gMIvkzFxGkCiCxvXJBb?r literal 0 HcmV?d00001 From 5bd6f98c6eab38384f7a52c476c2900d4ae59b2a Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 14:49:52 +0300 Subject: [PATCH 04/37] Add files via upload --- docs/tutorial.md | 207 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md new file mode 100644 index 00000000..5d8bc1e3 --- /dev/null +++ b/docs/tutorial.md @@ -0,0 +1,207 @@ +#Tutorial + +###The main goal of this tutorial is to show all capabilities of ... (this part will be supplemented) + +The simple visualization can be made with function `main`. (this part will be supplemented as well) +```kotlin +import kotlinx.html.div +import space.kscience.dataforge.context.Context +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.* +import java.nio.file.Paths + +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + } + } + } + } +} +``` +##Solids properties +**We will analyze which basic properties solids have using `box` solid.** + +Basic properties: +1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` - it's the point, around which the solid will be rotated. Initially, the value is `Point3D(0, 0, 0)` +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0` + +Let's see how properties are set in solids. +The `small box` will have elemental values of properties. If you will not set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. + +***You can see that `box` take four values. Later, we will discuss what they are doing in more detail. Now, it does not really matter.*** +```kotlin +box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) +} +``` +![](../docs/images/small box.png) + +The `big box` will have properties with custom values. +```kotlin +box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //color in rgb + rotation = Point3D(60, 80, 0) +} +``` +![](../docs/images/big rotated box.png) +If we compare these boxes, we will see all differences. + +Here is the function `main` with both boxes. +```kotlin +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) + } + box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //rgb + rotation = Point3D(60, 80, 0) + } + } + } + } + } +} +``` +![](../docs/images/two-boxes-1.png) +![](../docs/images/two-boxes-2.png) + +###Basic Solids +Now, let's see which solids can be visualized: +1) PolyLine +2) Box + ```kotlin + box(50, 50, 50, name = "box") { + x = 0 + y = 0 + z = 0 + color("pink") + } + ``` + ![](../docs/images/box.png) + ```kotlin + box(10, 25, 10, name = "high_box") { + x = 0 + y = 0 + z = 0 + color("black") + } + ``` + ![](../docs/images/high-box.png) + + ```kotlin + box(65, 40, 40, name = "wide_box") { + x = 0 + y = 0 + z = 0 + color("black") + } + ``` + ![](../docs/images/wide-box.png) + +3) Sphere + ```kotlin + sphere(50, name = "sphere") { + x = 0 + y = 0 + z = 0 + color("blue") + } + ``` + ![](../docs/images/sphere.png) +4) Hexagon + ```kotlin + hexagon( + Point3D(25, 30, 25), + Point3D(35, 30, 25), + Point3D(35, 30, 15), + Point3D(25, 30, 15), + Point3D(30, 18, 20), + Point3D(40, 18, 20), + Point3D(40, 18, 10), + Point3D(30, 18, 10), + name = "classic_hexagon"){ + color("green") + } + ``` + ![](../docs/images/classic-hexagon.png) + ```kotlin + hexagon( + Point3D(5, 30, 5), + Point3D(24, 30, 8), + Point3D(20, 30, -10), + Point3D(5, 30, -7), + Point3D(8, 16, 0), + Point3D(12, 16, 0), + Point3D(10, 16, -5), + Point3D(6.5, 12, -3), + name = "custom_hexagon"){ + color("brown") + } + ``` + ![](../docs/images/custom-hexagon.png) +5) Cone + ```kotlin + cone(60, 80, name = "cone") { + x = 0 + y = 0 + z = 0 + color("beige") + } + ``` + ![](../docs/images/cone-1.png) + ![](../docs/images/cone-2.png) +6) Cone Surface + ```kotlin + coneSurface(60, 50, 30, 10, 100, name = "cone_surface") { + x = 0 + y = 0 + z = 0 + color("red") + rotation = Point3D(2, 50, -9) + } + ``` + ![](../docs/images/cone-surface-1.png) + ![](../docs/images/cone-surface-2.png) +7) Extruded + From e37bc779883857d078712ced7500ec03b98e6658 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:37:59 +0300 Subject: [PATCH 05/37] Delete big rotated box.png --- docs/images/big rotated box.png | Bin 2206 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/big rotated box.png diff --git a/docs/images/big rotated box.png b/docs/images/big rotated box.png deleted file mode 100644 index 7b7cdc14dad92f2d151a2fbf735e3af14b4f54e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2206 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1$kV^0^ykczmschBYqM@lq2Oqr%5Xu82I zq`^fr#6Wbz0w(=sOj--LRJ1xGE;D6J+dOafL!l4;Z;m`}`7LMPud~CPF;Q%f)$`9A zcgDol?q$&Uk^E0G;Uf$82>~4i=M4=!2bqjUIiq1fK|0t0OjvXE6(8L_o&NbM|LWEG zpGBR8b*80SyNT!TJ0ott=ile~KVR9)-?xw4TWfXSz~tbgiElJ6J_+b~m&A4LX!~=q z$mb3lEE<)kxvH1QuE`9~m{`ij(p@W;7g^%eRBFf4J%8QjEpm(RM=#nvBkSv5&$^ng zht?HT^qFo*`*r;P>*Rl0I?V|i)1sE23Ac=v4n3wE!IKol|8Cw6Ljh3g?k;`VJ2m#< z3m`*&-g$9WbA7=gHJ0u|iDX{?4HDh44==EEo36L7<(r?AP||dC+9#!>>k4w3SW`H} zqLuVT?)?&4Xn1W0OZUYaqI^D}9Fycy*4iwjV`h2tKoX}Iv(YiBsRRzhto(O5zhe2!uW*XJu35#ytrjsy*!|vPU<4ogQSe>5thKbs z_0ryB5y8dza-XMX6s>9Wz3skH?m4g3_tN4W4-?wzYX4o6-b!FZXM#Ot{J^Hrr2njqtkuZFjdvUY@*B-bYx+ zY;X0?H`hDfa9%qo;rq|OpHFB_v2sMtEskqXwi(!F^t^i%cW{%uOhYp7os(CVy*>VC z@BQ>uSEnre*=DQ|F^BiP)hnPGYuD|I+_u4|>1gB*xdh4W-#NwD-&9U5;OyCWt}9_< zcOiebO2iy?PPwK8M#(1Edj}1tb^bPB>6V?7lQ5H|+c=@Ylnb051>Z;}OD6QXY}nD7 zD*}pbze-3n8+Oc1)?r?AkV9;@W!F(APBCZW15(`}(~iE)Iz749a2n&a3UFzCEVaQ@ z=3tVBond88)6un;)TMbgv_Vpu2J;$0PO-&?$E0Q?Y@A-o<*gLabMi>7$Mn^!*MC;c zsr>%w=9kAz|DQiU>wEu~SHM~~)rdErcQs%txZJ>+-Opd^0I?5UNFgSAb=zitK XkKfnK-t`&SreN@N^>bP0l+XkK2=+1# From 3a5da762d12c2099c407cc79e0cb9ac4fb59e5fb Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:38:14 +0300 Subject: [PATCH 06/37] Delete small box.png --- docs/images/small box.png | Bin 1503 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/small box.png diff --git a/docs/images/small box.png b/docs/images/small box.png deleted file mode 100644 index 4ebc0cb390e5e336b7ecefed54ab3c47d5666d84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1503 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1&?5>FS$kczmscQ)o8HV|=eG%`*R%Ad}; zWvKv;O-=d;LBpNxuk(wgg7WCe{=Vu?dQ!oY62C-048T@R;yNee(o? T_j6r Date: Wed, 28 Jul 2021 15:38:56 +0300 Subject: [PATCH 07/37] Add files via upload --- docs/images/big-rotated-box.png | Bin 0 -> 2206 bytes docs/images/small-box.png | Bin 0 -> 1503 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/big-rotated-box.png create mode 100644 docs/images/small-box.png diff --git a/docs/images/big-rotated-box.png b/docs/images/big-rotated-box.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7cdc14dad92f2d151a2fbf735e3af14b4f54e4 GIT binary patch literal 2206 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1$kV^0^ykczmschBYqM@lq2Oqr%5Xu82I zq`^fr#6Wbz0w(=sOj--LRJ1xGE;D6J+dOafL!l4;Z;m`}`7LMPud~CPF;Q%f)$`9A zcgDol?q$&Uk^E0G;Uf$82>~4i=M4=!2bqjUIiq1fK|0t0OjvXE6(8L_o&NbM|LWEG zpGBR8b*80SyNT!TJ0ott=ile~KVR9)-?xw4TWfXSz~tbgiElJ6J_+b~m&A4LX!~=q z$mb3lEE<)kxvH1QuE`9~m{`ij(p@W;7g^%eRBFf4J%8QjEpm(RM=#nvBkSv5&$^ng zht?HT^qFo*`*r;P>*Rl0I?V|i)1sE23Ac=v4n3wE!IKol|8Cw6Ljh3g?k;`VJ2m#< z3m`*&-g$9WbA7=gHJ0u|iDX{?4HDh44==EEo36L7<(r?AP||dC+9#!>>k4w3SW`H} zqLuVT?)?&4Xn1W0OZUYaqI^D}9Fycy*4iwjV`h2tKoX}Iv(YiBsRRzhto(O5zhe2!uW*XJu35#ytrjsy*!|vPU<4ogQSe>5thKbs z_0ryB5y8dza-XMX6s>9Wz3skH?m4g3_tN4W4-?wzYX4o6-b!FZXM#Ot{J^Hrr2njqtkuZFjdvUY@*B-bYx+ zY;X0?H`hDfa9%qo;rq|OpHFB_v2sMtEskqXwi(!F^t^i%cW{%uOhYp7os(CVy*>VC z@BQ>uSEnre*=DQ|F^BiP)hnPGYuD|I+_u4|>1gB*xdh4W-#NwD-&9U5;OyCWt}9_< zcOiebO2iy?PPwK8M#(1Edj}1tb^bPB>6V?7lQ5H|+c=@Ylnb051>Z;}OD6QXY}nD7 zD*}pbze-3n8+Oc1)?r?AkV9;@W!F(APBCZW15(`}(~iE)Iz749a2n&a3UFzCEVaQ@ z=3tVBond88)6un;)TMbgv_Vpu2J;$0PO-&?$E0Q?Y@A-o<*gLabMi>7$Mn^!*MC;c zsr>%w=9kAz|DQiU>wEu~SHM~~)rdErcQs%txZJ>+-Opd^0I?5UNFgSAb=zitK XkKfnK-t`&SreN@N^>bP0l+XkK2=+1# literal 0 HcmV?d00001 diff --git a/docs/images/small-box.png b/docs/images/small-box.png new file mode 100644 index 0000000000000000000000000000000000000000..4ebc0cb390e5e336b7ecefed54ab3c47d5666d84 GIT binary patch literal 1503 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1&?5>FS$kczmscQ)o8HV|=eG%`*R%Ad}; zWvKv;O-=d;LBpNxuk(wgg7WCe{=Vu?dQ!oY62C-048T@R;yNee(o? T_j6r Date: Wed, 28 Jul 2021 15:40:06 +0300 Subject: [PATCH 08/37] Update tutorial.md --- docs/tutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 5d8bc1e3..2e695b7c 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -51,7 +51,7 @@ box(10, 10, 10, name = "small box"){ rotation = Point3D(0, 0, 0) } ``` -![](../docs/images/small box.png) +![](../docs/images/small-box.png) The `big box` will have properties with custom values. ```kotlin @@ -64,7 +64,7 @@ box(40, 40, 40, name = "big box"){ rotation = Point3D(60, 80, 0) } ``` -![](../docs/images/big rotated box.png) +![](../docs/images/big-rotated-box.png) If we compare these boxes, we will see all differences. Here is the function `main` with both boxes. From 44da86d49641626c4436a874777a1c6c7b2fc277 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:40:25 +0300 Subject: [PATCH 09/37] Update tutorial.md --- docs/tutorial.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorial.md b/docs/tutorial.md index 2e695b7c..9dba5f3c 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -65,6 +65,7 @@ box(40, 40, 40, name = "big box"){ } ``` ![](../docs/images/big-rotated-box.png) + If we compare these boxes, we will see all differences. Here is the function `main` with both boxes. From f611409208c1ed072b9069cd571049ab50875a2b Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:41:04 +0300 Subject: [PATCH 10/37] Update tutorial.md --- docs/tutorial.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorial.md b/docs/tutorial.md index 9dba5f3c..9de1432b 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -108,6 +108,7 @@ fun main(){ ![](../docs/images/two-boxes-2.png) ###Basic Solids + Now, let's see which solids can be visualized: 1) PolyLine 2) Box From e818ecdcc3175f46e44a27534f40bbc3b08b508a Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:56:54 +0300 Subject: [PATCH 11/37] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c9312320..621f474f 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ * [visionforge-gdml](#visionforge-gdml) * [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) - * [Simple Example - Spatial Showcase](#simple-example---spatial-showcase) + * [Simple Example - Solid Showcase](#simple-example---solid-showcase) * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) * [GDML Example](#gdml-example) @@ -118,16 +118,16 @@ The `demo` module contains several example projects (demonstrations) of using th They are briefly described in this section, for more details please consult the corresponding per-project README file. -### Simple Example - Spatial Showcase +### Simple Example - Solid Showcase Contains a simple demonstration with a grid including a few shapes that you can rotate, move camera, and so on. Some shapes will also periodically change their color and visibility. -[More details](demo/spatial-showcase/README.md) +[More details](demo/solid-showcase/README.md) **Example view:** -![](docs/images/spatial-showcase.png) +![](docs/images/solid-showcase.png) ### Full-Stack Application Example - Muon Monitor Visualization @@ -156,4 +156,4 @@ Visualization example for geometry defined as GDML file. ## Thanks and references The original three.js bindings were made by [Lars Ivar Hatledal](https://github.com/markaren), but the project is discontinued right now. -All other libraries are explicitly shown as dependencies. We would like to express specific thanks to JetBrains Kotlin-JS team for consulting us during the work. \ No newline at end of file +All other libraries are explicitly shown as dependencies. We would like to express specific thanks to JetBrains Kotlin-JS team for consulting us during the work. From 786b902fd9acdf21ab03d055eda54a13bfe95d99 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 16:46:43 +0300 Subject: [PATCH 12/37] Update README.md --- demo/solid-showcase/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/solid-showcase/README.md b/demo/solid-showcase/README.md index 20866220..f8771e13 100644 --- a/demo/solid-showcase/README.md +++ b/demo/solid-showcase/README.md @@ -5,8 +5,8 @@ Some shapes will also periodically change their color and visibility. ##### Building project -To see the JS demo: run `demo/spatial-showcase/Tasks/distribution/jsBrowserDistribution` Gradle task, then open -`build/distribuions/spatial-showcase-js-0.1.3-dev/index.html` file in your browser. +To see the JS demo: run `demo/solid-showcase/Tasks/kotlin browser/jsBrowserRun` Gradle task, then open +`build/distribuions/solid-showcase-js-0.1.3-dev/index.html` file in your browser. To see Java FX demo, run `demo/spatial-showcase/Tasks/application/run` Gradle task, or `main()` from `FXDemoApp.kt`. From 72d3503dc34d4fa298cdf63942f9ecd209244263 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Thu, 29 Jul 2021 14:13:27 +0300 Subject: [PATCH 13/37] Add files via upload --- docs/images/cone-segment-1.png | Bin 0 -> 2691 bytes docs/images/cone-segment-2.png | Bin 0 -> 2754 bytes docs/images/cone-surface-fragment-2.png | Bin 0 -> 2169 bytes docs/images/cone-surface-fragment.png | Bin 0 -> 2410 bytes docs/images/cylinder-1.png | Bin 0 -> 2710 bytes docs/images/cylinder-2.png | Bin 0 -> 3225 bytes docs/images/cylinder.png | Bin 0 -> 2196 bytes docs/images/frustum-cone-segment.png | Bin 0 -> 2399 bytes docs/images/frustum-cone.png | Bin 0 -> 3016 bytes docs/images/scheme.png | Bin 0 -> 6981 bytes docs/images/tube-fragment.png | Bin 0 -> 2912 bytes docs/images/tube.png | Bin 0 -> 4630 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/cone-segment-1.png create mode 100644 docs/images/cone-segment-2.png create mode 100644 docs/images/cone-surface-fragment-2.png create mode 100644 docs/images/cone-surface-fragment.png create mode 100644 docs/images/cylinder-1.png create mode 100644 docs/images/cylinder-2.png create mode 100644 docs/images/cylinder.png create mode 100644 docs/images/frustum-cone-segment.png create mode 100644 docs/images/frustum-cone.png create mode 100644 docs/images/scheme.png create mode 100644 docs/images/tube-fragment.png create mode 100644 docs/images/tube.png diff --git a/docs/images/cone-segment-1.png b/docs/images/cone-segment-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b59005552588063eb38e7812efe3fb6719fa6908 GIT binary patch literal 2691 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 literal 0 HcmV?d00001 diff --git a/docs/images/cone-surface-fragment-2.png b/docs/images/cone-surface-fragment-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8eaa991ca335cc221f73a2329e13b37c2c1a99 GIT binary patch literal 2169 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1$kK2I0NkczmscLIy9SV=WpOu1%IuDmAi z9oG$6=|n+erK}Jw^ORNZnBShaV-NrAZRYP;yYwBy`}qB}^~@SSu0JksxGb!r;Jl%M z=OB|23-<|uQO?K;gU5egZ-3t}X!qyu)Ah%{e0z4gIap9fE^YZg>$==~_wOA)SMjy> zkYt7T3I4@l%0BH;yxHmYWd~Pth~@wP`RV=hkhjlb&pvv}^7@)vv)fv^ZvWailOM(` zulGH>ec(9rT7K{gX?K}K2i!I~Zi-4tu>$7c**+9A{hAw>`wKg#}IourB}Di^?0*tCu`8Eq}&bAkfq0p zH2pj_tb0FU-bNYQDjmBsb0t@n+P*tDljBIMdmoMLHym{-o%5ur`Hu;C< zt3*uSdOY=OhTi<$#%0Hht51BB^mE#v_inWf_$^T-bMLvchU@*-o_)EY#olMbx=gY3Z>jnh?Rx%NuDQO~ z{nioAz4d>;{WUC7{Jj5lwCAkP6|twAe?IwlhHKh;fpdpBUpIZ@-w;-QtVZLaQMPH@ zPph+$Yb}8BwPUa2W%Zl4+CQ!eo70;Rd*S`0E!B2DzRCBd7icw=D$iHRxpT|BRcZ~cB6;@XrDd-m6nzr~9K9?v>^>-5(11!hg9*`E_iE#i99D(z1IRhwFB z6nZw5n*M)tS))7Qy?tA6 YQMomwJ+p%m*j!-nboFyt=akR{02*#hU;qFB literal 0 HcmV?d00001 diff --git a/docs/images/cone-surface-fragment.png b/docs/images/cone-surface-fragment.png new file mode 100644 index 0000000000000000000000000000000000000000..2d82835f702b02da61d672d6227c20da8f9b5f8f GIT binary patch literal 2410 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 AAOHXW literal 0 HcmV?d00001 diff --git a/docs/images/cylinder-2.png b/docs/images/cylinder-2.png new file mode 100644 index 0000000000000000000000000000000000000000..88c406bf915e4fb3b7f57ace8aac2caa20326168 GIT binary patch literal 3225 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 AzyJUM literal 0 HcmV?d00001 diff --git a/docs/images/frustum-cone-segment.png b/docs/images/frustum-cone-segment.png new file mode 100644 index 0000000000000000000000000000000000000000..96e4170feebebce4effc85ba48f84feb4c921adb GIT binary patch literal 2399 zcmeHJ`!`g36hG?R7(&QgDb0`&BYD3c;}M3q3vrU%L*7JQ-7)3SOeiCd-X&Cu%CLs6 z>2?W+PAJa^xuQl<88jC|X6T;!1MbiL&<}g9{n=}O_xkL;*Z%H(<~I*#X-Q>C005+2 zT^zjtK&$|ha}w(?i@hR%0YEI#%h?{N?%wth17J9L9~l5@@})#UzhD@5)a5`T0LZj{ z6S20qyCDD|vEb@R_MryOjFJ<$5Zpps7ZtK)T+pjA^(+qmL%J}+?p6rZ`$T|a1s(llQ=c80cniFh;r5 zXpS%(`dvRYv`1kt+`>&P*WI8Bb?!Xaa2@8~Y<;e>yB)8m4q4fAs5nG&$-kh*S}2`4yB{PLuVgsua!o)=DGecc5H}Owm<$_gAsE-Zt#Z5@z5{D zE2QLQuWKj`jJCC*^a!>^*2p8DQeZ*K8&$&9FL%mmQFu>HXq1x_STA!mjGshD4G5XM z$;CS_8A32Rz;krMrWSdap()Q=9e#7;(}AJ4`gAl$^f2A(GRz0N?+<6eXQ#{f?@n5f zEOwQW9;cm8EvQf+HBzn&=fX93amcC|)*o^{KhR~}H;gKSOgH~lHW(e@P!`wFU#N?@LqdD=S0E+~`_^ZzR9cpzK59ijLe zp-R_=v9!N-rtfR*%5mLVDNnL7Z3<>mv2)|b2juWZ%i=ue&<>QC@jOLk=7obLq^YuiLU3!c~xAD`mrvFHf(KiYqYp0_>@`*T0LmFmBAy z?}kvTJDW@M+|pFr+rjCo)R7&l!CG`hL8Q$k!TWyUKjJC62rYWa)Ny`unH*{IgH9DN+#_O;%H)B>^u-n4TZALK?~EZ@ENzGY_Zb^{qCC&i2~PoTzo3W*b& zSgX*VZ3kAg4_M+;r_ zZ4hp|P5UxfIn|)?M_y--t?`se?p#s28*^=$zeHtvBc z=I_lX9CG}WBy1{?&wWO@k|f#d?wuEAr97zJZs>E)iEmz_F)-|LG>At(@8<1J*(M2!B`3@&47@m#6Xlg=1o;>DI zU?CBji&gF)$dN>%gj`=U>rrKw)9_=xI<>ZO`AOZ?`j++4L?;bagE+^&PL0AIW9~Ti z0@R6H^P20;u|P%`<_F&zLH87su@bOO@)+<8Qry>ZQ}MVOWEr2RlN5n=OAN-|Qxr~Q zmI>q6B)y`E^&u@I`Tf3keR&t*nVcQR1YHz~kSjk|+mF85{`U@1OB2qdo4s+5IIU_Y Qg&jqJtCNRgwLMJ#4}kX4f&c&j literal 0 HcmV?d00001 diff --git a/docs/images/frustum-cone.png b/docs/images/frustum-cone.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f6786c138e1ccf6b7dfa0367b9f1767cc39ace GIT binary patch literal 3016 zcmeHJ`8$+t8=kf|$@0l-ZDHhjzXa% z?T=ZzqEPGZu7%ioQAW#3Ni?F?g}K^UqAFjbKZ(G`APXl86pE3$b@}Wj5#Dm~7#M~^ zNwL;qU0dj*02FGgkG-{pTcq#w;MS0Lp4)7CI-dr0v!Z0L#7;a^Yb&T$n^kAL=C7BJ zu})B%lqbY?7W`bE*EJXCtWU?ur&%L6_rja@_Gs@+fY#XqTaOik=G*=){ZDVhi zjf}b7rm+yC-HX2ZV|-q}Ynh)%D z*Ilhoh`djMlE-ddbCg=@P9WY-g(OGl%68;)#9_M=2R<~T#Y%cVmvmTnHF7hfoCHENcam}PRsQ$%JR^!C5L49@YsCNB`{!LB4)-9S zUu6Y)Uqh!pt4;&QbNnDpNAE8Jv|=H85xA$9CQ;BB0X_@8@wxEE+QOGRHvl>>-B+qE zj$nhuU^#PSu?V#4rlCmRl<(lO+E}}C{3G_)9TZUVhX{NwZDx|^LkhNLLGSBJiA{g% zy_{jQo4K@jAo!&1;9HJ7j%QVuT8Y*N0ctHX^aAEQ?*c!q-T!*D8hK|07*Z=biXSY{ zhAEDSup*BKVnv(SXVCOe)xGfaJ|-r(^%G@-IvK(|0P}FXdVpHaJa-h&Q!%J4LmTdQ ztSkxN5~(p0qaISLkH^}P8imKtXL->bTX`-Z9R;^g6}?P~xhZsR>gtRFpDe=yDmlo*);tXEPlTq;k+_Fob6>JUPX)M@BGY~E7G_)1Qagu8 zrPv_KJ+yN;?C%^x>5OaI1a!qT$=}n5=KW(IV}eVoZS!cg@Phko-WTTrRFA7_f#{k* zH=j&7_&6fYQNHg|`}q1ehB|mLJy2tz6x8WkN#K@&+cS&0GmL6aW~rw_vzlX08s=j~6;{xL0W@b*$=XuUk`% zX64%M+&n+ZK;7VKh^mAvjyD?)J`u9T2X23!!_NC04XK*atoasQV7~NICl~DlWEKiK}z0}GI6W*rI zMTO}$p8uIEXNhl+S#0m~yeKT_-aoX=BVu`~lkjPoWhMEEQC%R!;bx-@oszA|0 z*!J6iMJ-3N!iAjvHb2SoYaGspx}?}ANfn7In)9Uiu5;O;(=QIjLnH=i*4cwvb*R8s zY4ZgRwh z*?25t8Py?%b4EloB*y%ghR!~kS)RQ#;`fChXgc!&v)zfOf=HL4kF4Z^CV}N4y)+Xb z*c;-#9*XADOrV0ZM%RQ~S~xVFcg76(qS)~_w*Vr!xhKj&02OT_lSD76_N3&|a#dB_ zjKX&-df8Phh^tB%h(3%o`~YWQX532rY~4*unbFBRqeJ|*w}T;Tfxs187uWPA+MEB} z{w&dnvgxY2ht`l`4RN^iV8g>v{NZQ$rJGqEaDN}&iCXnF4NA5_gu(_$AO{IAUFJX9 z;vX4J!Ek8;Ab4loz(5^FmX`c<#~C9+jH0ifu|Rv(Kr0s#2;OMVzHP~#*S2%|4~IZM zu-$9ftd;mGK<^okUCl^~lZZ*^HjcMib`Su6wp2B?ip;`vi4 z*@m`?h38eMlvuU9`+xiTN4@k3vPiZhNGl$dBE6H)kM*L{hXRr<5&u55fCOUBsD8)Z zKlRv&~7QP+A^7ZmXJ`TaGy%&hesuXlPf4p}-8f z!(-braCWjc-^&QydaiYLh!9Q8AgzZnF-&IA=@jxVrFpR-Li42zk`#=&&3rz7O6m`n z+yz6nRDpw$_;1kQN5e0&#bqxIdT2#`fk)zrVo98)cw(!U&S6l!1S~1nGGopOl=AON zKRPdX&Q=(gaEvw&x?;KD7U=+E9y0&hqv@BMaq#=u=JyvQudql1Y>CD literal 0 HcmV?d00001 diff --git a/docs/images/scheme.png b/docs/images/scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..baa6a8770a2603c1f6024b4f5d701a1a50673add GIT binary patch literal 6981 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 literal 0 HcmV?d00001 diff --git a/docs/images/tube-fragment.png b/docs/images/tube-fragment.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a20ebe67e0657fba74df58fd5f3354e49471d7 GIT binary patch literal 2912 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 T2mm$KEC*n2Vrg7!crWHZO*{K8 literal 0 HcmV?d00001 From a474ad7b3b9217220b9379308745e066857c7073 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Thu, 29 Jul 2021 14:19:29 +0300 Subject: [PATCH 14/37] Delete tutorial.md --- docs/tutorial.md | 209 ----------------------------------------------- 1 file changed, 209 deletions(-) delete mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md deleted file mode 100644 index 9de1432b..00000000 --- a/docs/tutorial.md +++ /dev/null @@ -1,209 +0,0 @@ -#Tutorial - -###The main goal of this tutorial is to show all capabilities of ... (this part will be supplemented) - -The simple visualization can be made with function `main`. (this part will be supplemented as well) -```kotlin -import kotlinx.html.div -import space.kscience.dataforge.context.Context -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.solid.* -import java.nio.file.Paths - -fun main(){ - val context = Context{ - plugin(Solids) - } - - context.makeVisionFile ( - Paths.get("customFile.html"), - resourceLocation = ResourceLocation.EMBED - ){ - div { - vision { - solid { - } - } - } - } -} -``` -##Solids properties -**We will analyze which basic properties solids have using `box` solid.** - -Basic properties: -1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. -2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, around which the solid will be rotated. Initially, the value is `Point3D(0, 0, 0)` -4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0` - -Let's see how properties are set in solids. -The `small box` will have elemental values of properties. If you will not set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. - -***You can see that `box` take four values. Later, we will discuss what they are doing in more detail. Now, it does not really matter.*** -```kotlin -box(10, 10, 10, name = "small box"){ - x = 0 - y = 0 - z = 0 - opacity = 1 //100% opacity - color("red") //as string - rotation = Point3D(0, 0, 0) -} -``` -![](../docs/images/small-box.png) - -The `big box` will have properties with custom values. -```kotlin -box(40, 40, 40, name = "big box"){ - x = 20 - y = 10 - z = 60 - opacity = 0.5 //50% opacity - color(0u, 179u, 179u) //color in rgb - rotation = Point3D(60, 80, 0) -} -``` -![](../docs/images/big-rotated-box.png) - -If we compare these boxes, we will see all differences. - -Here is the function `main` with both boxes. -```kotlin -fun main(){ - val context = Context{ - plugin(Solids) - } - - context.makeVisionFile ( - Paths.get("customFile.html"), - resourceLocation = ResourceLocation.EMBED - ){ - div { - vision { - solid { - box(10, 10, 10, name = "small box"){ - x = 0 - y = 0 - z = 0 - opacity = 1 //100% opacity - color("red") //as string - rotation = Point3D(0, 0, 0) - } - box(40, 40, 40, name = "big box"){ - x = 20 - y = 10 - z = 60 - opacity = 0.5 //50% opacity - color(0u, 179u, 179u) //rgb - rotation = Point3D(60, 80, 0) - } - } - } - } - } -} -``` -![](../docs/images/two-boxes-1.png) -![](../docs/images/two-boxes-2.png) - -###Basic Solids - -Now, let's see which solids can be visualized: -1) PolyLine -2) Box - ```kotlin - box(50, 50, 50, name = "box") { - x = 0 - y = 0 - z = 0 - color("pink") - } - ``` - ![](../docs/images/box.png) - ```kotlin - box(10, 25, 10, name = "high_box") { - x = 0 - y = 0 - z = 0 - color("black") - } - ``` - ![](../docs/images/high-box.png) - - ```kotlin - box(65, 40, 40, name = "wide_box") { - x = 0 - y = 0 - z = 0 - color("black") - } - ``` - ![](../docs/images/wide-box.png) - -3) Sphere - ```kotlin - sphere(50, name = "sphere") { - x = 0 - y = 0 - z = 0 - color("blue") - } - ``` - ![](../docs/images/sphere.png) -4) Hexagon - ```kotlin - hexagon( - Point3D(25, 30, 25), - Point3D(35, 30, 25), - Point3D(35, 30, 15), - Point3D(25, 30, 15), - Point3D(30, 18, 20), - Point3D(40, 18, 20), - Point3D(40, 18, 10), - Point3D(30, 18, 10), - name = "classic_hexagon"){ - color("green") - } - ``` - ![](../docs/images/classic-hexagon.png) - ```kotlin - hexagon( - Point3D(5, 30, 5), - Point3D(24, 30, 8), - Point3D(20, 30, -10), - Point3D(5, 30, -7), - Point3D(8, 16, 0), - Point3D(12, 16, 0), - Point3D(10, 16, -5), - Point3D(6.5, 12, -3), - name = "custom_hexagon"){ - color("brown") - } - ``` - ![](../docs/images/custom-hexagon.png) -5) Cone - ```kotlin - cone(60, 80, name = "cone") { - x = 0 - y = 0 - z = 0 - color("beige") - } - ``` - ![](../docs/images/cone-1.png) - ![](../docs/images/cone-2.png) -6) Cone Surface - ```kotlin - coneSurface(60, 50, 30, 10, 100, name = "cone_surface") { - x = 0 - y = 0 - z = 0 - color("red") - rotation = Point3D(2, 50, -9) - } - ``` - ![](../docs/images/cone-surface-1.png) - ![](../docs/images/cone-surface-2.png) -7) Extruded - From d51a38eac41a0fe64cbf1a88809c877c96773ac0 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Thu, 29 Jul 2021 14:20:15 +0300 Subject: [PATCH 15/37] Add files via upload Not final version of tutorial --- docs/tutorial.md | 333 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md new file mode 100644 index 00000000..15b24b3c --- /dev/null +++ b/docs/tutorial.md @@ -0,0 +1,333 @@ +# Tutorial + +#### The main goal of this tutorial is to show all capabilities of ... (this part will be supplemented) + +The simple visualization can be made with function `main`. (this part will be supplemented as well) +```kotlin +import kotlinx.html.div +import space.kscience.dataforge.context.Context +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.* +import java.nio.file.Paths + +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + } + } + } + } +} +``` +## Solids properties +**We will analyze which basic properties solids have using `box` solid.** + +*Basic properties:* +1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` - it's the point, around which the solid will be rotated. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. + +Let's see how properties are set in solids. +The `small box` will have elemental values of properties. If you will not set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. + +***You can see that `box` take four values. Later, we will discuss what they do in more detail. Now, it does not really matter.*** +```kotlin +box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) +} +``` +![](../docs/images/small-box.png) + +The `big box` will have properties with custom values. +```kotlin +box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //color in rgb + rotation = Point3D(60, 80, 0) +} +``` +![](../docs/images/big-rotated-box.png) +If we compare these boxes, we will see all differences. + +Here is the function `main` with both boxes. +```kotlin +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) + } + box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //rgb + rotation = Point3D(60, 80, 0) + } + } + } + } + } +} +``` +![](../docs/images/two-boxes-1.png) +![](../docs/images/two-boxes-2.png) + +***There is plenty of other properties, especially of those, which you can create by yourself. Here we mention just small part.*** + +## Basic Solids +Now, let's see which solids can be visualized: +### 1) PolyLine +### 2) Box + +First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` +* `x` - x-axis length of the `box` +* `y` - y-axis length of the `box` +* `z` - z-axis length of the `box` + +These values have `Float` type. *`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* + +* `name` - `box`'es identifier with `String` type. *It's an optional value, but without it you won't be able to control solid.* + +Let's create just usual `box` with equal ribs. + +```kotlin + box(50, 50, 50, name = "box") { + color("pink") + } +``` + ![](../docs/images/box.png) + +Now, let's make `box` with bigger `y` value. + ```kotlin + box(10, 25, 10, name = "high box") { + color("black") + } + ``` +As you can see, only rib of `y-axis` differs from other ribs. + + ![](../docs/images/high-box.png) + +For final trial, let's create `box` with bigger `x` value. + + ```kotlin + box(65, 40, 40, name = "wide box") { + x = 0 + y = 0 + z = 0 + color("black") + } + ``` +Predictably, only `x-axis` rib bigger than other ribs. + + ![](../docs/images/wide-box.png) + +### 3) Sphere + +It takes in two values: `radius`, and `name`. +Actually, `name` is general value for all solids, so do not wonder, since all solids need their own identifier. + +As for `radius`, it has `Float` type, and, as you can guess, it sets radius of the sphere, which will be created. + ```kotlin + sphere(50, name = "sphere") { + x = 0 + y = 0 + z = 0 + opacity = 0.9 + color("blue") + } + ``` + ![](../docs/images/sphere.png) + +### 4) Hexagon + +It is solid which has six edges. It is set by eight values: `node1`,..., `node8`. They all have `Point3D` type, so they are just points, vertices. + +*Six edges are these:* +1) Edge with vertices `node1`, `node4`, `node3`, `node2` +2) Edge with vertices `node1`, `node2`, `node6`, `node5` +3) Edge with vertices `node2`, `node3`, `node7`, `node6` +4) Edge with vertices `node4`, `node8`, `node7`, `node3` +5) Edge with vertices `node1`, `node5`, `node8`, `node4` +6) Edge with vertices `node8`, `node5`, `node6`, `node7` + +![](../docs/images/scheme.png) + +As hexagon takes in specific points, we understand that this solid cannot be moved, it fixed in space, and it can't make pivots. + +Let's make classic parallelepiped. +```kotlin + hexagon( + Point3D(25, 30, 25), + Point3D(35, 30, 25), + Point3D(35, 30, 15), + Point3D(25, 30, 15), + Point3D(30, 18, 20), + Point3D(40, 18, 20), + Point3D(40, 18, 10), + Point3D(30, 18, 10), + name = "classic hexagon"){ + color("green") + } +``` + ![](../docs/images/classic-hexagon.png) + +Now, let's make a custom hexagon. + + ```kotlin + hexagon( + Point3D(5, 30, 5), + Point3D(24, 30, 8), + Point3D(20, 30, -10), + Point3D(5, 30, -7), + Point3D(8, 16, 0), + Point3D(12, 16, 0), + Point3D(10, 16, -5), + Point3D(6.5, 12, -3), + name = "custom_hexagon"){ + color("brown") + } + ``` + ![](../docs/images/custom-hexagon.png) +### 3) Cone +It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. + +Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. + +As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. + +Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. + +Let's build a classic cone: +```kotlin + cone(60, 80, name = "cone") { + color("beige") + } + ``` + ![](../docs/images/cone-1.png) + ![](../docs/images/cone-2.png) + +First of all, we have to try to build a frustum cone: +```kotlin +cone(60, 80, name = "cone") { + color(0u, 40u, 0u) +} +``` +![](../docs/images/frustum-cone.png) + +Now, we need to make a try to build a cone segment: + +```kotlin +cone(60, 80, angle = PI, name = "cone") { + color(0u, 0u, 200u) +} +``` +![](../docs/images/cone-segment-1.png) +![](../docs/images/cone-segment-2.png) + +Finally, the segment of frustum cone is left for a try: +```kotlin +cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { + color(190u, 0u, 0u) +} +``` +![](../docs/images/frustum-cone-segment.png) + +### 4) Cone Surface +This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. + +In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. +`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. + +Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` + +Let's build usual cone surface with almost all properties set: +```kotlin + coneSurface(60, 50, 30, 10, 100, name = "cone surface") { + color("red") + rotation = Point3D(2, 50, -9) + } + ``` +![](../docs/images/cone-surface-1.png) +![](../docs/images/cone-surface-2.png) + +Now, let's create a cone surface and set all it's properties: + +```kotlin +coneSurface(30, 25, 10, 10, 8,0f, pi*3/4, name = "cone surface") { + color("fuchsia") + rotation = Point3D(2, 50, -9) +} +``` +![](../docs/images/cone-surface-fragment.png) +![](../docs/images/cone-surface-fragment-2.png) + +### 5) Cylinder + +This solid is set by `radius`, and `height`. As you can see by accepting values, there's no option of building fragments of cylinders. + +Here's a demonstration of a cylinder: + +```kotlin +cylinder(40, 100, "cylinder"){ + rotation = Point3D(40, 0, 0) + color("indigo") +} +``` +![](../docs/images/cylinder-1.png) +![](../docs/images/cylinder-2.png) +### 6) Tube + +`tube` takes in `radius`, `height`, `innerRadius`, `startAngle`, `angle`, and `name`. *All values are familiar from `cone`, and `coneSurface` solids.* + +Here is an example of classic tube: +```kotlin +tube(50, 40, 20, name = "usual tube"){ + opacity = 0.4 +} +``` +![](../docs/images/tube.png) + +This is an example of tube fragment: + +```kotlin +tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ + color("white") +} +``` +![](../docs/images/tube-fragment.png) +### 7) Extruded + From 4bdea746fc35a8c19d62254e466fa9989e80f6f6 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 4 Aug 2021 22:07:51 +0300 Subject: [PATCH 16/37] Images for polyline --- docs/images/polyline-points-2.png | Bin 0 -> 2912 bytes docs/images/polyline-points.png | Bin 0 -> 2547 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/polyline-points-2.png create mode 100644 docs/images/polyline-points.png diff --git a/docs/images/polyline-points-2.png b/docs/images/polyline-points-2.png new file mode 100644 index 0000000000000000000000000000000000000000..716ebb181df3321015fbcc3309a6cb808c54995b GIT binary patch literal 2912 zcmeHJX;>3?8XwLE$~6QLXt>6LAgFlICF;uI7!n8&*2IwatO1~c{pEtU3`)y| zkX;!7pwxgp5*v){;s8K?iUM2zo$2vjSaI?zTS=bxp755s$l5(lp(mVm-1}n$?r|Bi zVeL1jyP7gXxi@L=BWW#T;ac$~PX2Dt(!kMlDt6G}7UqL)T`csyOtrJ33Bx>LF$8JTVaD9k%ICVHuL>9?U-1{`=! zats7>BTRMD%MKP98kL)ZS1C^$edu=kc7|DxBOxGYIsKu;=**+|Y9kMsPykPaD{jR#N~V zLzPQppf0W=8-0^n6h+CRkK@2+U#4Xh!oN>x57+RQ4THK|=IeCeId3$jqq!Ug! z00}h5XQ(j!bpjeQL6zf(@Ur2T`vNSKGJAxF+^FwdM2!cmF78yJ{)I_dJZn6XbJA?% zE{-E%ufu#rTFP##92Vi954UGAEpu2jJjXFFs)YTxJearzn&=aZ++yL(!8dT!qgz{T zk2fO=i$bTmq1f4Ju`9P*!PWu3#UgJOAcQ?BcK-@;A*Jx|G#tW%fslapGeoDBRb?K6 z1U43dkc|Vpr@|Ljnld}$x>K+5&L)A|D%THA4LDI<*@)aGq~;=M1WFkf677|8SV2z@ zSF3V7Rt(0gZ=$#5R%PaI68KmIz7j>g#T!C`cn^r~-`r<+3Vicdf;o8A5Yiqshj@fU z18rJ%3g2C#&w0g9`Hkf$LtEnd1L10|6<5JT?C`5zuK{P6gv0V7CU0*ymI{qAIe$1N z$a-PeTP@u~)zKp#7D&RvumM#t-ZR|BC!HeZ{& z>}t-Jp}yN19!+m|eI~tpQsI#n=#q#$+dK~!%0U9Ce?Hz3!NsV$`JY38Z2Xir3l~%A zB%Q0bx?#&tcO&)mCa*-%9|WHruXnLtiCsx+2m^1KI~)%`!}hM-y6Cg zHRHCl^(4(t4Qlv)akB2=2XXkBnpoMkcKrwcfh)dg6|1=9uhFs_q>Ns{i?UoF&s zLlJKV+Rv%wYr8fo=~WAYy^gNloi)(QH;>V775uLd%1P3t2iE!B&?{v#jfQ}((seLW z?~mO6y7@()QD@i9bpBn?B?&2~@EV+vFWc;4jf=JQ_h4zA&QMUz;tCoBBTW5IfVDo# c^skw>JR2O}b5~UV6^e=h%0WlC)W+-F?+ouEhX4Qo literal 0 HcmV?d00001 diff --git a/docs/images/polyline-points.png b/docs/images/polyline-points.png new file mode 100644 index 0000000000000000000000000000000000000000..68d5d1416b059d3433259b4bb8e4e9f6cf536add GIT binary patch literal 2547 zcmeH}ZBP?O7{@P00?2^@DkdQ!g1lHjQZCA?0uc!yqGD@NQKRT3YQ_p-1SM#IAfPF= zN|7Ycm_mz6Rgf7eA`ssI&0UCP~p{moRlUG&{lS0Z=?QK18A2zEVN-Z0x^>f)!W$$_+xNCHv?OX4vq``Fn zaa^fg2ZWiJ154yMdnYtR7NZC{Oipp2GxyvvT9KRZG2J9+sWV& z^HISXOGz>9;tF>iJr?^%&;b%Cv8UD4w7KN&bRnDoL+jH^C5JRByI4h~vC_InRBe&O@>eo7~9+6^XW_ zEwGf_D?o=<6CAja9QgSvp=UY2p;ZVwz>vbu6pcjSu`QFE+E1y6HYky%WpstF3A)%_ z`qtxhOSzL=ocSxU?x%Y4atFFKO^VZCL$G$=$H%OUb7Me0m1MiS_L=4;=u7^3z~6MH_xdc+CTC^`?!%Hi#D*Wq5RTDO7Y0S!EXFA?XiVJn1 zJ6`=wRXr|sSWM6ON-AfKi%zRW4NcZ0LmL) zf-K^6FNC+f9v~QCx1V^=!S|O6e5LI_(~>kb-lo0WLsRtVleLZgkITFVYO-o}_@zuc zw?HnwGjdY4e0e7Xe{69mam!y$qtkYdqufjwKV9gr1=>g zir}#9mB9jDp-+Yf7I1eGsdI1Mb=a9UOD+~}EgZKQWlFaN-VXhsr>(wlosAsrz>eQ$4O`G?CCM3EYF^Hqp*YG_{c&&qF?h-@VVFBUhz*zjVYq44 zV%~!IYk~N}lLpnKPH$NNPY>D}41&hi8Y_+m&Yd#px;L$LR#yHasoQ}}*bH;%{-5N}dH+AYZ-{ Date: Wed, 4 Aug 2021 22:08:38 +0300 Subject: [PATCH 17/37] Delete tutorial.md --- docs/tutorial.md | 333 ----------------------------------------------- 1 file changed, 333 deletions(-) delete mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md deleted file mode 100644 index 15b24b3c..00000000 --- a/docs/tutorial.md +++ /dev/null @@ -1,333 +0,0 @@ -# Tutorial - -#### The main goal of this tutorial is to show all capabilities of ... (this part will be supplemented) - -The simple visualization can be made with function `main`. (this part will be supplemented as well) -```kotlin -import kotlinx.html.div -import space.kscience.dataforge.context.Context -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.solid.* -import java.nio.file.Paths - -fun main(){ - val context = Context{ - plugin(Solids) - } - - context.makeVisionFile ( - Paths.get("customFile.html"), - resourceLocation = ResourceLocation.EMBED - ){ - div { - vision { - solid { - } - } - } - } -} -``` -## Solids properties -**We will analyze which basic properties solids have using `box` solid.** - -*Basic properties:* -1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. -2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, around which the solid will be rotated. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. -4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. - -Let's see how properties are set in solids. -The `small box` will have elemental values of properties. If you will not set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. - -***You can see that `box` take four values. Later, we will discuss what they do in more detail. Now, it does not really matter.*** -```kotlin -box(10, 10, 10, name = "small box"){ - x = 0 - y = 0 - z = 0 - opacity = 1 //100% opacity - color("red") //as string - rotation = Point3D(0, 0, 0) -} -``` -![](../docs/images/small-box.png) - -The `big box` will have properties with custom values. -```kotlin -box(40, 40, 40, name = "big box"){ - x = 20 - y = 10 - z = 60 - opacity = 0.5 //50% opacity - color(0u, 179u, 179u) //color in rgb - rotation = Point3D(60, 80, 0) -} -``` -![](../docs/images/big-rotated-box.png) -If we compare these boxes, we will see all differences. - -Here is the function `main` with both boxes. -```kotlin -fun main(){ - val context = Context{ - plugin(Solids) - } - - context.makeVisionFile ( - Paths.get("customFile.html"), - resourceLocation = ResourceLocation.EMBED - ){ - div { - vision { - solid { - box(10, 10, 10, name = "small box"){ - x = 0 - y = 0 - z = 0 - opacity = 1 //100% opacity - color("red") //as string - rotation = Point3D(0, 0, 0) - } - box(40, 40, 40, name = "big box"){ - x = 20 - y = 10 - z = 60 - opacity = 0.5 //50% opacity - color(0u, 179u, 179u) //rgb - rotation = Point3D(60, 80, 0) - } - } - } - } - } -} -``` -![](../docs/images/two-boxes-1.png) -![](../docs/images/two-boxes-2.png) - -***There is plenty of other properties, especially of those, which you can create by yourself. Here we mention just small part.*** - -## Basic Solids -Now, let's see which solids can be visualized: -### 1) PolyLine -### 2) Box - -First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` -* `x` - x-axis length of the `box` -* `y` - y-axis length of the `box` -* `z` - z-axis length of the `box` - -These values have `Float` type. *`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* - -* `name` - `box`'es identifier with `String` type. *It's an optional value, but without it you won't be able to control solid.* - -Let's create just usual `box` with equal ribs. - -```kotlin - box(50, 50, 50, name = "box") { - color("pink") - } -``` - ![](../docs/images/box.png) - -Now, let's make `box` with bigger `y` value. - ```kotlin - box(10, 25, 10, name = "high box") { - color("black") - } - ``` -As you can see, only rib of `y-axis` differs from other ribs. - - ![](../docs/images/high-box.png) - -For final trial, let's create `box` with bigger `x` value. - - ```kotlin - box(65, 40, 40, name = "wide box") { - x = 0 - y = 0 - z = 0 - color("black") - } - ``` -Predictably, only `x-axis` rib bigger than other ribs. - - ![](../docs/images/wide-box.png) - -### 3) Sphere - -It takes in two values: `radius`, and `name`. -Actually, `name` is general value for all solids, so do not wonder, since all solids need their own identifier. - -As for `radius`, it has `Float` type, and, as you can guess, it sets radius of the sphere, which will be created. - ```kotlin - sphere(50, name = "sphere") { - x = 0 - y = 0 - z = 0 - opacity = 0.9 - color("blue") - } - ``` - ![](../docs/images/sphere.png) - -### 4) Hexagon - -It is solid which has six edges. It is set by eight values: `node1`,..., `node8`. They all have `Point3D` type, so they are just points, vertices. - -*Six edges are these:* -1) Edge with vertices `node1`, `node4`, `node3`, `node2` -2) Edge with vertices `node1`, `node2`, `node6`, `node5` -3) Edge with vertices `node2`, `node3`, `node7`, `node6` -4) Edge with vertices `node4`, `node8`, `node7`, `node3` -5) Edge with vertices `node1`, `node5`, `node8`, `node4` -6) Edge with vertices `node8`, `node5`, `node6`, `node7` - -![](../docs/images/scheme.png) - -As hexagon takes in specific points, we understand that this solid cannot be moved, it fixed in space, and it can't make pivots. - -Let's make classic parallelepiped. -```kotlin - hexagon( - Point3D(25, 30, 25), - Point3D(35, 30, 25), - Point3D(35, 30, 15), - Point3D(25, 30, 15), - Point3D(30, 18, 20), - Point3D(40, 18, 20), - Point3D(40, 18, 10), - Point3D(30, 18, 10), - name = "classic hexagon"){ - color("green") - } -``` - ![](../docs/images/classic-hexagon.png) - -Now, let's make a custom hexagon. - - ```kotlin - hexagon( - Point3D(5, 30, 5), - Point3D(24, 30, 8), - Point3D(20, 30, -10), - Point3D(5, 30, -7), - Point3D(8, 16, 0), - Point3D(12, 16, 0), - Point3D(10, 16, -5), - Point3D(6.5, 12, -3), - name = "custom_hexagon"){ - color("brown") - } - ``` - ![](../docs/images/custom-hexagon.png) -### 3) Cone -It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. - -Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. - -As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. - -Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. - -Let's build a classic cone: -```kotlin - cone(60, 80, name = "cone") { - color("beige") - } - ``` - ![](../docs/images/cone-1.png) - ![](../docs/images/cone-2.png) - -First of all, we have to try to build a frustum cone: -```kotlin -cone(60, 80, name = "cone") { - color(0u, 40u, 0u) -} -``` -![](../docs/images/frustum-cone.png) - -Now, we need to make a try to build a cone segment: - -```kotlin -cone(60, 80, angle = PI, name = "cone") { - color(0u, 0u, 200u) -} -``` -![](../docs/images/cone-segment-1.png) -![](../docs/images/cone-segment-2.png) - -Finally, the segment of frustum cone is left for a try: -```kotlin -cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { - color(190u, 0u, 0u) -} -``` -![](../docs/images/frustum-cone-segment.png) - -### 4) Cone Surface -This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. - -In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. -`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. - -Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` - -Let's build usual cone surface with almost all properties set: -```kotlin - coneSurface(60, 50, 30, 10, 100, name = "cone surface") { - color("red") - rotation = Point3D(2, 50, -9) - } - ``` -![](../docs/images/cone-surface-1.png) -![](../docs/images/cone-surface-2.png) - -Now, let's create a cone surface and set all it's properties: - -```kotlin -coneSurface(30, 25, 10, 10, 8,0f, pi*3/4, name = "cone surface") { - color("fuchsia") - rotation = Point3D(2, 50, -9) -} -``` -![](../docs/images/cone-surface-fragment.png) -![](../docs/images/cone-surface-fragment-2.png) - -### 5) Cylinder - -This solid is set by `radius`, and `height`. As you can see by accepting values, there's no option of building fragments of cylinders. - -Here's a demonstration of a cylinder: - -```kotlin -cylinder(40, 100, "cylinder"){ - rotation = Point3D(40, 0, 0) - color("indigo") -} -``` -![](../docs/images/cylinder-1.png) -![](../docs/images/cylinder-2.png) -### 6) Tube - -`tube` takes in `radius`, `height`, `innerRadius`, `startAngle`, `angle`, and `name`. *All values are familiar from `cone`, and `coneSurface` solids.* - -Here is an example of classic tube: -```kotlin -tube(50, 40, 20, name = "usual tube"){ - opacity = 0.4 -} -``` -![](../docs/images/tube.png) - -This is an example of tube fragment: - -```kotlin -tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ - color("white") -} -``` -![](../docs/images/tube-fragment.png) -### 7) Extruded - From 145673752e145dc3dac5c0db859e0a675d441fbf Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 4 Aug 2021 22:09:15 +0300 Subject: [PATCH 18/37] Updated tutorial, some details left --- docs/tutorial.md | 373 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 373 insertions(+) create mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md new file mode 100644 index 00000000..d70d306d --- /dev/null +++ b/docs/tutorial.md @@ -0,0 +1,373 @@ +# Tutorial + +#### The main goal of this tutorial is to show main capabilities of the visualization instrument. + +The simple visualization can be made with function `main`. (this part will be supplemented) +```kotlin +import kotlinx.html.div +import space.kscience.dataforge.context.Context +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.* +import java.nio.file.Paths + +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("nameFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + //first vision + vision { + solid { + //solids which you want to visualize + } + } + //second vision + vision { + solid { + //solids which you want to visualize + } + } + } + } +} +``` +## Solids properties +**We will analyze which basic properties solids have using `box` solid.** + +*Basic properties:* +1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` - it's the point, which set rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. + +Let's see how properties are set in solids. +The `small box` will have elemental values of properties. If you don't set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. + +***You can see that `box` take four values. Later, we will discuss what they do in more detail. Now, it does not really matter.*** +```kotlin +box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) +} +``` +![](../docs/images/small-box.png) + +The `big box` will have properties with custom values. +```kotlin +box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //color in rgb + rotation = Point3D(60, 80, 0) +} +``` +![](../docs/images/big-rotated-box.png) +If we compare these boxes, we will see all differences. + +Here is the function `main` with both boxes. +```kotlin +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) + } + box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //rgb + rotation = Point3D(60, 80, 0) + } + } + } + } + } +} +``` +![](../docs/images/two-boxes-1.png) +![](../docs/images/two-boxes-2.png) + +***There is plenty of other properties, especially of those, which you can create by yourself. Here we mention just small part.*** + +## Basic Solids +Now, let's see which solids can be visualized: +### 1) PolyLine + +It's scarcely a solid, but it can be visualized, so we mention it. +`polyline` build lines, obviously. Let's take a look at it's work. + +`polyline` requires two values - `points`, and `name`: +* `points` is a `vararg` with `Point3D` type. It takes pairs of points, which you want to connect. +* `name` is an identifier of *any solid*, but in this case it is an identifier of `polyline`. +It's type is `String`. **This value can be required by any solid; +you can set it, you can not to set it, but without you won't be able to control solid, since it won't be inherited.** + +This is an example of polyline with other solid `box`: +```kotlin +box(100, 100, 100, name = "box"){ + x = -10 + y = -10 + z = -10 + opacity = 0.4 +} +polyline(Point3D(30, 20, 10), Point3D(30, -100, 30), Point3D(30, -100, 30), Point3D(50, -100, 30), name = "polyline"){ + color("red") +} +``` + +![](../docs/images/polyline-points.png) +![](../docs/images/polyline-points-2.png) + +### 2) Box + +First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` +* `x` - x-axis length of the `box` +* `y` - y-axis length of the `box` +* `z` - z-axis length of the `box` + +These values have `Float` type. + +*`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* + +* `name` - `box`'es identifier. You've already met it. + +Let's create just usual `box` with equal ribs. + +```kotlin + box(50, 50, 50, name = "box") { + color("pink") + } +``` + ![](../docs/images/box.png) + +Now, let's make `box` with bigger `y` value. + ```kotlin + box(10, 25, 10, name = "high box") { + color("black") + } + ``` +As you can see, only rib of `y-axis` differs from other ribs. + + ![](../docs/images/high-box.png) + +For final trial, let's create `box` with bigger `x` value. + + ```kotlin + box(65, 40, 40, name = "wide box") { + x = 0 + y = 0 + z = 0 + color("black") + } + ``` +Predictably, only `x-axis` rib bigger than other ribs. + + ![](../docs/images/wide-box.png) + +### 3) Sphere + +It takes in two values: `radius`, and `name`. +We bring you to mind that `name` is a general value for all solids, so do not wonder, since all solids need their own identifier. + +As for `radius`, it has `Float` type, and, as you can guess, it sets radius of the sphere, which will be created. + ```kotlin + sphere(50, name = "sphere") { + x = 0 + y = 0 + z = 0 + opacity = 0.9 + color("blue") + } + ``` + ![](../docs/images/sphere.png) + +### 4) Hexagon + +It is solid which has six edges. It is set by eight values: `node1`,..., `node8`. They all have `Point3D` type, so they are just points, vertices. + +*Six edges are these:* +1) Edge with vertices `node1`, `node4`, `node3`, `node2` +2) Edge with vertices `node1`, `node2`, `node6`, `node5` +3) Edge with vertices `node2`, `node3`, `node7`, `node6` +4) Edge with vertices `node4`, `node8`, `node7`, `node3` +5) Edge with vertices `node1`, `node5`, `node8`, `node4` +6) Edge with vertices `node8`, `node5`, `node6`, `node7` + +![](../docs/images/scheme.png) + +As hexagon takes in specific points, we understand that this solid cannot be moved, it fixed in space, and it can't make pivots. + +Let's make classic parallelepiped. +```kotlin + hexagon( + Point3D(25, 30, 25), + Point3D(35, 30, 25), + Point3D(35, 30, 15), + Point3D(25, 30, 15), + Point3D(30, 18, 20), + Point3D(40, 18, 20), + Point3D(40, 18, 10), + Point3D(30, 18, 10), + name = "classic hexagon"){ + color("green") + } +``` + ![](../docs/images/classic-hexagon.png) + +Now, let's make a custom hexagon. + + ```kotlin + hexagon( + Point3D(5, 30, 5), + Point3D(24, 30, 8), + Point3D(20, 30, -10), + Point3D(5, 30, -7), + Point3D(8, 16, 0), + Point3D(12, 16, 0), + Point3D(10, 16, -5), + Point3D(6.5, 12, -3), + name = "custom_hexagon"){ + color("brown") + } + ``` + ![](../docs/images/custom-hexagon.png) +### 3) Cone +It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. + +Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. + +As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. + +Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. + +Let's build a classic cone: +```kotlin + cone(60, 80, name = "cone") { + color("beige") + } + ``` + ![](../docs/images/cone-1.png) + ![](../docs/images/cone-2.png) + +First of all, we have to try to build a frustum cone: +```kotlin +cone(60, 80, name = "cone") { + color(0u, 40u, 0u) +} +``` +![](../docs/images/frustum-cone.png) + +Now, we need to make a try to build a cone segment: + +```kotlin +cone(60, 80, angle = PI, name = "cone") { + color(0u, 0u, 200u) +} +``` +![](../docs/images/cone-segment-1.png) +![](../docs/images/cone-segment-2.png) + +Finally, the segment of frustum cone is left for a try: +```kotlin +cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { + color(190u, 0u, 0u) +} +``` +![](../docs/images/frustum-cone-segment.png) + +### 4) Cone Surface +This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. + +In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. +`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. + +Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` + +Let's build usual cone surface with almost all properties set: +```kotlin + coneSurface(60, 50, 30, 10, 100, name = "cone surface") { + color("red") + rotation = Point3D(2, 50, -9) + } + ``` +![](../docs/images/cone-surface-1.png) +![](../docs/images/cone-surface-2.png) + +Now, let's create a cone surface and set all it's properties: + +```kotlin +coneSurface(30, 25, 10, 10, 8,0f, pi*3/4, name = "cone surface") { + color("fuchsia") + rotation = Point3D(2, 50, -9) +} +``` +![](../docs/images/cone-surface-fragment.png) +![](../docs/images/cone-surface-fragment-2.png) + +### 5) Cylinder + +This solid is set by `radius`, and `height`. As you can see by accepting values, there's no option of building fragments of cylinders. + +Here's a demonstration of a cylinder: + +```kotlin +cylinder(40, 100, "cylinder"){ + rotation = Point3D(40, 0, 0) + color("indigo") +} +``` +![](../docs/images/cylinder-1.png) +![](../docs/images/cylinder-2.png) +### 6) Tube + +`tube` takes in `radius`, `height`, `innerRadius`, `startAngle`, `angle`, and `name`. *All values are familiar from `cone`, and `coneSurface` solids.* + +Here is an example of classic tube: +```kotlin +tube(50, 40, 20, name = "usual tube"){ + opacity = 0.4 +} +``` +![](../docs/images/tube.png) + +This is an example of tube fragment: + +```kotlin +tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ + color("white") +} +``` +![](../docs/images/tube-fragment.png) +### 7) Extruded + +`extruded` is set by two values: `shape`, and `layer`. +* `shape` is a value of `List` type. It' s just a list of all points of the solid. *`shape` has to consist of not less than two points!* +* `layer` is `MutableList` types variable. (here is a sentence with description of the work of this function). *The amount of `layer`-s has to be more than one* + From 639a192d59ce1b8bbdb263a380d8515e0aa76793 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 4 Aug 2021 22:11:09 +0300 Subject: [PATCH 19/37] Small renamings --- .../kscience/visionforge/solid/Extruded.kt | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index d5943e3a..480da818 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -2,9 +2,8 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.visionforge.VisionBuilder -import space.kscience.visionforge.VisionContainerBuilder -import space.kscience.visionforge.set +import space.kscience.dataforge.meta.Config +import space.kscience.visionforge.* import kotlin.math.PI import kotlin.math.cos import kotlin.math.sin @@ -13,7 +12,7 @@ import kotlin.math.sin public typealias Shape2D = List @Serializable -public class Shape2DBuilder(private val points: MutableList = ArrayList()) { +public class Shape2DBuilder(private val points: ArrayList = ArrayList()) { public fun point(x: Number, y: Number) { points.add(Point2D(x, y)) @@ -38,19 +37,9 @@ public data class Layer(var x: Float, var y: Float, var z: Float, var scale: Flo @Serializable @SerialName("solid.extrude") public class Extruded( - public var shape: List = ArrayList(), - public var layers: MutableList = ArrayList() -) : SolidBase(), GeometrySolid { - - public fun shape(block: Shape2DBuilder.() -> Unit) { - this.shape = Shape2DBuilder().apply(block).build() - //TODO send invalidation signal - } - - public fun layer(z: Number, x: Number = 0.0, y: Number = 0.0, scale: Number = 1.0) { - layers.add(Layer(x.toFloat(), y.toFloat(), z.toFloat(), scale.toFloat())) - //TODO send invalidation signal - } + public val shape: List, + public val layers: List +) : SolidBase(), GeometrySolid, VisionPropertyContainer { override fun toGeometry(geometryBuilder: GeometryBuilder) { val shape: Shape2D = shape @@ -103,6 +92,24 @@ public class Extruded( } } +public class ExtrudeBuilder( + public var shape: List = emptyList(), + public var layers: MutableList = ArrayList(), + config: Config = Config() +) : SimpleVisionPropertyContainer(config) { + public fun shape(block: Shape2DBuilder.() -> Unit) { + this.shape = Shape2DBuilder().apply(block).build() + } + + public fun layer(z: Number, x: Number = 0.0, y: Number = 0.0, scale: Number = 1.0) { + layers.add(Layer(x.toFloat(), y.toFloat(), z.toFloat(), scale.toFloat())) + } + + internal fun build(): Extruded = Extruded(shape, layers).apply { configure(config) } +} + @VisionBuilder -public fun VisionContainerBuilder.extrude(name: String? = null, action: Extruded.() -> Unit = {}): Extruded = - Extruded().apply(action).also { set(name, it) } \ No newline at end of file +public fun VisionContainerBuilder.extruded( + name: String? = null, + action: ExtrudeBuilder.() -> Unit = {} +): Extruded = ExtrudeBuilder().apply(action).build().also { set(name, it) } From 89cff65a90dcc6fe09f366da814012378a3dbf5c Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Thu, 5 Aug 2021 16:46:02 +0300 Subject: [PATCH 20/37] Renamings in Gdml --- .../kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt index 98b4509e..0bba2f1a 100644 --- a/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt +++ b/visionforge-gdml/src/commonMain/kotlin/space/kscience/visionforge/gdml/GdmlTransformer.kt @@ -248,7 +248,7 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { name = name ) } - is GdmlXtru -> extrude(name) { + is GdmlXtru -> extruded(name) { shape { solid.vertices.forEach { point(it.x * lScale, it.y * lScale) @@ -284,7 +284,7 @@ private class GdmlTransformerEnv(val settings: GdmlTransformer) { name = name, ) is GdmlOrb -> sphere(solid.r * lScale, name = name) - is GdmlPolyhedra -> extrude(name) { + is GdmlPolyhedra -> extruded(name) { //getting the radius of first require(solid.planes.size > 1) { "The polyhedron geometry requires at least two planes" } val baseRadius = solid.planes.first().rmax * lScale From eea617f418ff88584e1190e7408ab02247c31379 Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Thu, 5 Aug 2021 16:40:41 +0700 Subject: [PATCH 21/37] Use standard GA configuration --- .github/workflows/build.yml | 33 +++++++++++++++++++++++ .github/workflows/gradle.yml | 19 ------------- .github/workflows/pages.yml | 28 +++++++++++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- 6 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/gradle.yml create mode 100644 .github/workflows/pages.yml mode change 100644 => 100755 gradlew diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..412460ae --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,33 @@ +name: Gradle build + +on: + push: + branches: [ dev, master ] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 40 + steps: + - uses: actions/checkout@v2 + - uses: DeLaGuardo/setup-graalvm@4.0 + with: + graalvm: 21.2.0 + java: java11 + arch: amd64 + - uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- + - uses: actions/cache@v2 + with: + path: ~/.konan + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- + - run: ./gradlew build --build-cache --no-daemon --stacktrace diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index 15ef5105..00000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Gradle build - -on: [push] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: 11 - - name: Make gradlew executable - run: chmod +x ./gradlew - - name: Build with Gradle - run: ./gradlew build diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 00000000..134d3d48 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,28 @@ +name: Dokka publication + +on: + push: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 40 + steps: + - uses: actions/checkout@v2 + - uses: DeLaGuardo/setup-graalvm@4.0 + with: + graalvm: 21.2.0 + java: java11 + arch: amd64 + - uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- + - run: ./gradlew dokkaHtmlMultiModule --build-cache --no-daemon --no-parallel --stacktrace + - uses: JamesIves/github-pages-deploy-action@4.1.0 + with: + branch: gh-pages + folder: build/dokka/htmlMultiModule diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 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 B8dv}T delta 17845 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 X49Luk)baa85H9$5YCsTPT`SVRWMtMW diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f371643e..05679dc3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 4f906e0c..744e882e --- a/gradlew +++ b/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) From 426c1ff990b6e115b73602ddba8c5ec2f9794bdd Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:13 +0300 Subject: [PATCH 22/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index d70d306d..924b62c5 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -244,18 +244,19 @@ Let's make classic parallelepiped. Now, let's make a custom hexagon. ```kotlin - hexagon( - Point3D(5, 30, 5), - Point3D(24, 30, 8), - Point3D(20, 30, -10), - Point3D(5, 30, -7), - Point3D(8, 16, 0), - Point3D(12, 16, 0), - Point3D(10, 16, -5), - Point3D(6.5, 12, -3), - name = "custom_hexagon"){ - color("brown") - } +hexagon( + Point3D(5, 30, 5), + Point3D(24, 30, 8), + Point3D(20, 30, -10), + Point3D(5, 30, -7), + Point3D(8, 16, 0), + Point3D(12, 16, 0), + Point3D(10, 16, -5), + Point3D(6.5, 12, -3), + name = "custom_hexagon" +) { + color("brown") +} ``` ![](../docs/images/custom-hexagon.png) ### 3) Cone @@ -370,4 +371,3 @@ tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ `extruded` is set by two values: `shape`, and `layer`. * `shape` is a value of `List` type. It' s just a list of all points of the solid. *`shape` has to consist of not less than two points!* * `layer` is `MutableList` types variable. (here is a sentence with description of the work of this function). *The amount of `layer`-s has to be more than one* - From b3ecc2136e0eb922f4953339c6c53152ddcf6b25 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:20 +0300 Subject: [PATCH 23/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 924b62c5..83da43d9 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -1,6 +1,6 @@ # Tutorial -#### The main goal of this tutorial is to show main capabilities of the visualization instrument. +#### The main goal of this tutorial is to show the main capabilities of the visualization instrument. The simple visualization can be made with function `main`. (this part will be supplemented) ```kotlin From 2c2b7a5fa2ec555a388d33414ff72a264bde163c Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:34 +0300 Subject: [PATCH 24/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 83da43d9..aeef2aa1 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -120,7 +120,7 @@ fun main(){ Now, let's see which solids can be visualized: ### 1) PolyLine -It's scarcely a solid, but it can be visualized, so we mention it. +It's scarcely a solid, but it can be visualized, so we mention it. `polyline` build lines, obviously. Let's take a look at it's work. `polyline` requires two values - `points`, and `name`: From d5c0afd8c0f641a68870777081c75af0858d9403 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:51 +0300 Subject: [PATCH 25/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index aeef2aa1..dfb5f65f 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -369,5 +369,5 @@ tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ ### 7) Extruded `extruded` is set by two values: `shape`, and `layer`. -* `shape` is a value of `List` type. It' s just a list of all points of the solid. *`shape` has to consist of not less than two points!* +* `shape` is a value of `List` type. It's just a list of all points of the solid. *`shape` has to consist of not less than two points!* * `layer` is `MutableList` types variable. (here is a sentence with description of the work of this function). *The amount of `layer`-s has to be more than one* From 6d7356f08c7d0601d401ba50b5dc6a79c6f05ac0 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:43:57 +0300 Subject: [PATCH 26/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index dfb5f65f..97d4a00e 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -187,7 +187,7 @@ For final trial, let's create `box` with bigger `x` value. color("black") } ``` -Predictably, only `x-axis` rib bigger than other ribs. +Predictably, only the `x-axis` rib is bigger than other ribs. ![](../docs/images/wide-box.png) From 689071d0da4a0ee647bac17b7febdcbed9df7841 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:44:28 +0300 Subject: [PATCH 27/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 97d4a00e..0052f3e9 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -196,7 +196,7 @@ Predictably, only the `x-axis` rib is bigger than other ribs. It takes in two values: `radius`, and `name`. We bring you to mind that `name` is a general value for all solids, so do not wonder, since all solids need their own identifier. -As for `radius`, it has `Float` type, and, as you can guess, it sets radius of the sphere, which will be created. +As for `radius`, it has `Float` type, and, as you can guess, it sets the radius of the sphere which will be created. ```kotlin sphere(50, name = "sphere") { x = 0 From 1d7776807183aa9ac8a05f665d4619f297754601 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:44:38 +0300 Subject: [PATCH 28/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 0052f3e9..e8b8a5b0 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -262,7 +262,7 @@ hexagon( ### 3) Cone It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. -Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. +Obviously, `bottomRadius` is responsible for the radius of a bottom base, and `height` sets the height of a cone along the `z-axis`. As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. From f71130ea0bd700a8dd139ba491d85dd346f1f11e Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:44:44 +0300 Subject: [PATCH 29/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index e8b8a5b0..ba302ff9 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -370,4 +370,4 @@ tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ `extruded` is set by two values: `shape`, and `layer`. * `shape` is a value of `List` type. It's just a list of all points of the solid. *`shape` has to consist of not less than two points!* -* `layer` is `MutableList` types variable. (here is a sentence with description of the work of this function). *The amount of `layer`-s has to be more than one* +* `layer` is `MutableList` types variable. (here is a sentence with a description of the work of this function). *The amount of `layer`-s has to be more than one* From 133de264c11020be5733408a8072ff7fa2225836 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:48:26 +0300 Subject: [PATCH 30/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index ba302ff9..3bdab769 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -222,7 +222,7 @@ It is solid which has six edges. It is set by eight values: `node1`,..., `node8` ![](../docs/images/scheme.png) -As hexagon takes in specific points, we understand that this solid cannot be moved, it fixed in space, and it can't make pivots. +As the hexagon takes in specific points, we understand that this solid cannot be moved, it is fixed in space, and it can't make pivots. Let's make classic parallelepiped. ```kotlin From cb057db93bb3a7306a0a345342da14efd6c5728e Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:48:38 +0300 Subject: [PATCH 31/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 3bdab769..f2c13af0 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -42,7 +42,7 @@ fun main(){ *Basic properties:* 1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. 2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, which set rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. +3. `rotation` - it's the point, which sets rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. 4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. Let's see how properties are set in solids. From 2d6be6629a6f88f59f70ef988410cd43fe6ee735 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:48:56 +0300 Subject: [PATCH 32/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index f2c13af0..fbe064c2 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -114,7 +114,7 @@ fun main(){ ![](../docs/images/two-boxes-1.png) ![](../docs/images/two-boxes-2.png) -***There is plenty of other properties, especially of those, which you can create by yourself. Here we mention just small part.*** +***There is plenty of other properties, especially those, which you can create by yourself. Here we mention just a small part.*** ## Basic Solids Now, let's see which solids can be visualized: From 9c6d646b53cac8037c714c523e69b336eed0c0d0 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:49:11 +0300 Subject: [PATCH 33/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index fbe064c2..3ce8848e 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -125,7 +125,7 @@ It's scarcely a solid, but it can be visualized, so we mention it. `polyline` requires two values - `points`, and `name`: * `points` is a `vararg` with `Point3D` type. It takes pairs of points, which you want to connect. -* `name` is an identifier of *any solid*, but in this case it is an identifier of `polyline`. +* `name` is an identifier of *any solid*; but in this case, it is an identifier of `polyline`. It's type is `String`. **This value can be required by any solid; you can set it, you can not to set it, but without you won't be able to control solid, since it won't be inherited.** From 16c3144b45a767a58784a6865c12751fc9b1d99b Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:49:21 +0300 Subject: [PATCH 34/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 3ce8848e..d21286a9 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -173,7 +173,7 @@ Now, let's make `box` with bigger `y` value. color("black") } ``` -As you can see, only rib of `y-axis` differs from other ribs. +As you can see, only the rib of `y-axis` differs from other ribs. ![](../docs/images/high-box.png) From 84e0211b54ec1f420c989879e1dda1db03747a9e Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:49:37 +0300 Subject: [PATCH 35/37] Update docs/tutorial.md Co-authored-by: Iaroslav Postovalov <38042667+CommanderTvis@users.noreply.github.com> --- docs/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index d21286a9..02344e2f 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -177,7 +177,7 @@ As you can see, only the rib of `y-axis` differs from other ribs. ![](../docs/images/high-box.png) -For final trial, let's create `box` with bigger `x` value. +For a final trial, let's create a `box` with a bigger `x` value. ```kotlin box(65, 40, 40, name = "wide box") { From 99c6d0e14ce3c8515db4e1f248c0c8768ed0eee9 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 6 Aug 2021 10:56:44 +0300 Subject: [PATCH 36/37] Update tutorial.md --- docs/tutorial.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 02344e2f..8989bd49 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -40,10 +40,10 @@ fun main(){ **We will analyze which basic properties solids have using `box` solid.** *Basic properties:* -1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. -2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, which sets rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. -4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. +1. `opacity` — It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` — It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` — it's the point, which sets rotations along axes. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` — pivot around `y axis`, changing `z` — pivot around `z axis`. +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this — vertical `y` axis and horizontal `Oxz` plane. Let's see how properties are set in solids. The `small box` will have elemental values of properties. If you don't set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. @@ -123,7 +123,7 @@ Now, let's see which solids can be visualized: It's scarcely a solid, but it can be visualized, so we mention it. `polyline` build lines, obviously. Let's take a look at it's work. -`polyline` requires two values - `points`, and `name`: +`polyline` requires two values — `points`, and `name`: * `points` is a `vararg` with `Point3D` type. It takes pairs of points, which you want to connect. * `name` is an identifier of *any solid*; but in this case, it is an identifier of `polyline`. It's type is `String`. **This value can be required by any solid; @@ -148,15 +148,15 @@ polyline(Point3D(30, 20, 10), Point3D(30, -100, 30), Point3D(30, -100, 30), Poin ### 2) Box First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` -* `x` - x-axis length of the `box` -* `y` - y-axis length of the `box` -* `z` - z-axis length of the `box` +* `x` — x-axis length of the `box` +* `y` — y-axis length of the `box` +* `z` — z-axis length of the `box` These values have `Float` type. *`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* -* `name` - `box`'es identifier. You've already met it. +* `name` — `box`'es identifier. You've already met it. Let's create just usual `box` with equal ribs. @@ -264,9 +264,9 @@ It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, ` Obviously, `bottomRadius` is responsible for the radius of a bottom base, and `height` sets the height of a cone along the `z-axis`. -As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. +As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` — `0f`, `angle` — `PI2`, so if you don't set them, you'll get just a simple cone. -Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. +Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` — an angle, starting with which segment will be left, `angle` — an angle of cone, which will be set from `startAngle`. Let's build a classic cone: ```kotlin @@ -307,7 +307,7 @@ cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. -`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. +`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` — of the upper circle. They have no initial value, so that means they have to be set. Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` From 623d1e7e3ede7de22c6e87da10e53c1ce3c04da5 Mon Sep 17 00:00:00 2001 From: kiruma524 Date: Fri, 6 Aug 2021 11:26:09 +0300 Subject: [PATCH 37/37] demo renamings --- .../kotlin/space/kscience/visionforge/solid/demo/demo.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 2385fef1..f0235266 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -108,7 +108,7 @@ fun VisionLayout.showcase() { } demo("extrude", "extruded shape") { - extrude { + extruded { shape { polygon(8, 50) }