tuxmartin

Usecka trivilanim algortimem

Sep 27th, 2013
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.96 KB | None | 0 0
  1. package cz.uhk.vanclma2.tvary;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Point;
  5.  
  6. import cz.uhk.vanclma2.gui.DrawImage;
  7.  
  8. /**
  9.  *
  10.  * @author Martin Vancl
  11.  *
  12.  */
  13.  
  14. public class UseckaTrivial implements TvaryIface {
  15.     private int x1;
  16.     private int y1;
  17.     private int x2;
  18.     private int y2;
  19.     private Color barva;
  20.  
  21.     /**
  22.      * Nakresli usecku trivialnim algoritmem. Trida UseckaTrivial obsahuje metody pro ScanLine
  23.      * vyplnovaci algoritmus - je nutne ji pouzit pro ScanLine.
  24.      * @param start
  25.      *              Pocatecni bod usecky
  26.      * @param cil
  27.      *              Koncovy bod usecky
  28.      * @param barva
  29.      *              Barva usecky
  30.      */
  31.     public UseckaTrivial(Point start, Point cil, Color barva) {    
  32.         this.x1 = start.x;
  33.         this.y1 = start.y;
  34.         this.x2 = cil.x;
  35.         this.y2 = cil.y;
  36.         this.barva = barva;    
  37.     }
  38.  
  39.    
  40.     // pro scan line ###########################################
  41.    
  42.     public UseckaTrivial(UseckaTrivial usecka) {
  43.         this.x1 = usecka.x1;
  44.         this.x2 = usecka.x2;
  45.         this.y1 = usecka.y1;
  46.         this.y2 = usecka.y2;
  47.     }
  48.    
  49.     /**
  50.      * Otoci smer usecky
  51.      */
  52.     public void prohodKoncoveBody() {
  53.         if (y2 < y1) {
  54.             int p;
  55.            
  56.             p = x1;
  57.             x1 = x2;
  58.             x2 = p;
  59.            
  60.             p = y1;
  61.             y1 = y2;
  62.             y2 = p;
  63.         }
  64.     }
  65.  
  66.     /**
  67.      * Najde prusecik 2 usecek
  68.      */
  69.     public int zjistiPrusecik(int y) {
  70.         float dy = y1 - y2;
  71.         float dx = x1 - x2;    
  72.         float k = dx / dy;
  73.         float q = k * (y - y1) + x1;
  74.         return (int) q;
  75.     }
  76.    
  77.     /**
  78.      * U vodorovnych usecek se nepocitaji pruseciky
  79.      * @return true/false podle toho, jestli je vodorovna
  80.      */
  81.     public boolean jeVodorovna() {
  82.         return (y2 == y1);
  83.     }
  84.    
  85.     public boolean jePrusecik(int y) {
  86.         return ((y1 < y) && (y <= y2));
  87.     }
  88.    
  89.     public int getX1() {
  90.         return x1;
  91.     }
  92.    
  93.     public int getY1() {
  94.         return y1;
  95.     }
  96.    
  97.     public int getX2() {
  98.         return x2;
  99.     }
  100.    
  101.     public int getY2() {
  102.         return y2;
  103.     }
  104.    
  105.     // pro scan line ###########################################   
  106.    
  107.     public void kresli() {
  108.         // http://cs.wikipedia.org/wiki/P%C5%99%C3%ADmka#Sm.C4.9Brnicov.C3.A1_rovnice_p.C5.99.C3.ADmky
  109.         if (Math.abs(x2 - x1) > Math.abs(y2 - y1)) { // k<1 - funkce klesajici
  110.             if (x1 > x2) {  // vymena koncovych bodu
  111.                 int pomocna1;
  112.                 pomocna1 = x2;
  113.                 x2 = x1;
  114.                 x1 = pomocna1;
  115.        
  116.                 int pomocna2;
  117.                 pomocna2 = y2;
  118.                 y2 = y1;
  119.                 y1 = pomocna2;
  120.         }      
  121.             float k = (float)(y1 - y2) / (x1 - x2); // k = smernice primky, vyjadruje sklon
  122.             float q = y2 - k * x2; // posunuti na ose y
  123.            
  124.             for (int x = x1; x <= x2; x++) {
  125.                 int y = (int)(k * x + q);              
  126.                 DrawImage.kresliPixel(x, y, barva);
  127.             }          
  128.         } else { // k>0 - funkce rostouci
  129.             if (y1 > y2) {  // vymena koncovych bodu
  130.                 int pomocna1;
  131.                 pomocna1 = x2;
  132.                 x2 = x1;
  133.                 x1 = pomocna1;
  134.            
  135.                 int pomocna2;
  136.                 pomocna2 = y2;
  137.                 y2 = y1;
  138.                 y1 = pomocna2;
  139.             }
  140.             float k = (float)(x1 - x2) / (y1 - y2);
  141.             float q = x2 - k * y2;
  142.            
  143.             for (int y = y1; y <= y2; y++) {
  144.                 int x = (int)(k * y + q);      
  145.                 DrawImage.kresliPixel(x, y, barva);
  146.             }          
  147.         }      
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment