home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 November / Chip_1999-11_cd.bin / ctenari / Plavja / Exe / zakladni.dk < prev   
Text File  |  1999-09-02  |  4KB  |  191 lines

  1. // knihovna: ZAKLADNI.DK
  2. // autor: Petr Plavjanφk
  3. // obsah: zßkladnφ funkce
  4.  
  5. // stφn bodu B ve sm∞ru osv∞tlenφ s
  6. stin (s, B) {
  7.   r = rovnobezka(s, B);
  8.   V = p(m(Pi, Ny), r);
  9.   videt(V:0, 2, 0);
  10.   videt(V:1, 1, 0);
  11.   vrat V;
  12. }
  13.  
  14. // Φφslo barvy slo₧enΘ ze slo₧ek: 
  15. // R Φervenß
  16. // G zelenß
  17. // B modrß
  18. RGB (R, G, B) {  
  19.   vrat B*256*256 + G*256 + R;
  20. }
  21.  
  22. // p°enese bod nejen na p°φmku a zm∞nφ ho
  23. // vracφ nßrys
  24. po_ordinale(Ro1, Ro2, *B, p) {
  25.   kdyz (Ro1==Pi) n=1;
  26.   kdyz (Ro1==Ny) n=2;
  27.   kdyz (Ro1==Tau) n=3;
  28.   kdyz (Ro2==Pi) m=1;
  29.   kdyz (Ro2==Ny) m=2;
  30.   kdyz (Ro2==Tau) m=3;
  31.   
  32.   i=0;
  33.   pocet = pocet(B);
  34.   dokud (i<pocet) {
  35.     k = kolmice(Ro2, x, (B:i).m);
  36.     B2 = p(p.m, k);
  37.     R2 = B2;
  38.     R = bod((B:i), B2);
  39.     zrus(B2);
  40.     zrus(k);
  41.     zvetsi(i);
  42.   }
  43.   prepis(B, R);
  44.   
  45.   vrat R2;
  46. }
  47.  
  48. // minimalni rozdil cisel ze skupiny c od (jednoho) cisla x
  49. min_delta (c, x) {
  50.   minc = -1;
  51.   min = 99999;
  52.   pocet = pocet(c);
  53.   i = 0;
  54.   dokud(i < pocet) {
  55.     kdyz(abs(c:i - x) < min) { 
  56.       prepis(min, abs(c:i - x));
  57.       prepis(minc, i);
  58.     }
  59.     zvetsi(i);
  60.   }
  61.   vrat [min, minc];
  62. }
  63.  
  64. // prunik krivky tvorene body s primkou (1 bod)
  65. prunik_k_p(body_krivky, primka) {
  66.   blizkost = poloha(primka, body_krivky);
  67.   cislo = min_delta(blizkost, 0):1;
  68.   kdyz (cislo != -1) { V = body_krivky:cislo;
  69.     k = kolmice(primka, V);
  70.     vrat p(primka, k);
  71.   }
  72.   jinak vrat nic();
  73. }
  74.  
  75. prunik_k_p2(body_krivky, primka) {
  76.   blizkost = polohan(primka, body_krivky);
  77.   cislo = min_delta(blizkost, 0):1;
  78.   kdyz (cislo != -1) { V = body_krivky:cislo;
  79.     k = kolmice(primka, V);
  80.     vrat p(primka, k);
  81.   }
  82.   jinak vrat nic();
  83. }
  84.  
  85. // prunik krivky tvorene body s primkou (vφce bod∙)
  86. // nastaveni presnosti (minimalni vzdalenost od primky)
  87. // a minimalni vzdalenosti dvou sousednich vysledku
  88. pruniky_k_p(body_krivky, primka, presnost, vzdal) {
  89.   i = 0;
  90.   pocet = pocet(body_krivky);
  91.   dokud (i < pocet) {
  92.     kdyz(abs(poloha(primka, body_krivky:i)) <= presnost)
  93.     {
  94.       k = kolmice(primka, body_krivky:i);
  95.       R = p(primka, k);
  96.     }
  97.     zvetsi(i);  
  98.   }
  99.   zrus(i); zrus(pocet);
  100.   V = seradbnp(primka, beznic(R));  
  101.  
  102.   i = 1; 
  103.   pocet = pocet(V);
  104.   kdyz (pocet > 0) W = V:0;
  105.   dokud (i < pocet) {
  106.     kdyz (v(W:(pocet(W)-1), V:(i)) >= vzdal) W = V:i;
  107.     zvetsi(i);
  108.   }
  109.   
  110.   vrat beznic(W);
  111. }
  112.  
  113. pruniky_k_p2(body_krivky, primka, presnost, vzdal) {
  114.   i = 0;
  115.   pocet = pocet(body_krivky);
  116.   dokud (i < pocet) {
  117.     kdyz(abs(polohan(primka, body_krivky:i)) <= presnost)
  118.     {
  119.       k = kolmice(primka, body_krivky:i);
  120.       R = p(primka, k);
  121.     }
  122.     zvetsi(i);  
  123.   }
  124.   zrus(i); zrus(pocet);
  125.   V = seradbnp(primka, beznic(R));  
  126.  
  127.   i = 1; 
  128.   pocet = pocet(V);
  129.   kdyz (pocet > 0) W = V:0;
  130.   dokud (i < pocet) {
  131.     kdyz (v(W:(pocet(W)-1), V:(i)) >= vzdal) W = V:i;
  132.     zvetsi(i);
  133.   }
  134.   
  135.   vrat beznic(W);
  136. }
  137.  
  138.  
  139. koule (S, r) {
  140.   k = kruz(Pi, S.1, r);
  141.   k = kruz(Ny, S.2, r);
  142.   vrat k;
  143. }
  144.  
  145. // vytvo°φ vßlec v obecnΘ poloze: dv∞ elipsy, boΦnφ p°φmky
  146. // bez viditelnosti
  147. valec (Ro, S, r, v) {
  148.   k = kruz(Ro, S, r);
  149.   o = kolmice(Ro, S);
  150.  
  151.   //hornφ podstava
  152.   S2 = bod(o, S, v):1;
  153.   Ro2 = rovnobezna(Ro, S2);
  154.   k = kruz(Ro2, S2, r);
  155.  
  156.   //boΦnφ Φßry vßlce
  157.   stopap = p(Ro, Pi);
  158.   stopan = p(Ro, Ny); 
  159.   lp = rovnobezka(stopap, S);
  160.   ln = rovnobezka(stopan, S);
  161.   LP = bod(lp, S, r);
  162.   LN = bod(ln, S, r);
  163.   lp2 = rovnobezka(stopap, S);
  164.   ln2 = rovnobezka(stopan, S);
  165.   LP2 = bod(lp2, S2, r);
  166.   LN2 = bod(ln2, S2, r);
  167.   sn = usecka(LN:0, LN2:0);
  168.   sn = usecka(LN:1, LN2:1);
  169.   sp = usecka(LP:0, LP2:0);
  170.   sp = usecka(LP:1, LP2:1);
  171.   
  172.   // schovßnφ nßrysu nebo p∙dorysu
  173. //  sek(k:0, 1, 1, LP:0, LP:1, 1);
  174. //  sek(k:0, 2, 1, LP:0, LP:1, 0);
  175. //  sek(k:0, 1, 2, LN:0, LN:1, 1);
  176. //  sek(k:0, 2, 2, LN:0, LN:1, 0);
  177. //  videt(k, vse, 1, ?, ?, 2, 0);  
  178. //  videt(k:0, 2, vse, 1, ?, ?, 1, 3);
  179. //  videt(k:1, 2, vse, 1, ?, ?, 1, 3);
  180.   
  181.   videt(sp, 2, 0);
  182.   videt(sn, 1, 0);
  183. //  videt(sp, 1, 1, ?, ?, 2, 0);
  184. //  videt(sn, 2, 1, ?, ?, 2, 0);
  185.  
  186.   videt(m(LP, LP2, LN, LN2), vse, 0);
  187.   popis(k:1, vse, 0);
  188.   
  189.   vrat m(k.1, k.2, sp, sn);
  190. }
  191.