Zaznaczenie pola przecięcia prostych

0

Witam,

mam taki problem, gdyż nie wiem jak w programie zaznaczyć żeby na wykresie zaznaczyć pole przecięcia 3 prostych. Może ktoś pomoże :)

package javaapplication12;

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.text.DecimalFormat;
import java.text.NumberFormat;

class PanelGrafi
                                            
  extends JPanel                          
  implements ActionListener{                                 
    final static Color kolorRamki = Color.green;              
    final static Color kolorTla   = Color.white;            
    final static Color kolorLiter = Color.orange;       
    
   
    
    JTextField parametr1; 
    JTextField parametr2;
    JTextField parametr3;
    JTextField parametr4;
    JTextField parametr5;
    JTextField parametr6;
    String stringParametru1 = ""; 
    String stringParametru2 = "";
    String stringParametru3 = "";
    String stringParametru4 = "";
    String stringParametru5 = "";
    String stringParametru6 = "";

     
    

    public PanelGrafi(JTextField _parametr1,JTextField _parametr2,JTextField _parametr3,JTextField _parametr4,JTextField _parametr5,JTextField _parametr6){ 
        parametr1 = _parametr1; 
        parametr2 = _parametr2;
        parametr3 = _parametr3;
        parametr4 = _parametr4;
        parametr5 = _parametr5;
        parametr6 = _parametr6;
   
     
    } 
    public void paint(Graphics g){ 
        Font fb = new Font( "SansSerif", Font.BOLD, 12 ); 
        Font f = new Font( "TimesRoman", Font.PLAIN, 10 ); 
        Dimension d = getSize(); // Pobiera aktualne rozmiary panela
        g.setColor(kolorTla); // Wypełnia panel kolorem tła 
        g.fillRect(0, 0, d.width - 1, d.height - 1); 
        g.setColor(kolorRamki); // Rysuje ramkę dookoła panela 
        g.drawRect(0, 0, d.width - 1, d.height - 1); 
        g.translate (d.width/2,d.height/2); 
        int y=0,c=0; 
        if(parametr1!=null || parametr2!=null || parametr3!=null || parametr4!=null || parametr5!=null || parametr6!=null  ){ 
            try{ 
                float an=Float.parseFloat(parametr1.getText());             
                float bn=Float.parseFloat(parametr2.getText()); 
                float an1=Float.parseFloat(parametr3.getText()); 
                float bn1=Float.parseFloat(parametr4.getText()); 
                float an2=Float.parseFloat(parametr5.getText()); 
                float bn2=Float.parseFloat(parametr6.getText()); 
                     
                g.setColor(Color.black); 
                g.drawLine( -1*((d.width/2)-20), 0, (d.width/2)-20, 0 ); 
                g.drawLine( 0, -1*((d.height/2)-20), 0, (d.height/2)-20 ); 
                g.drawLine((d.width/2)-30,-8,(d.width/2)-20,0); 
                g.drawLine((d.width/2)-30,8,(d.width/2)-20,0); 
                g.drawLine(-8,-1*((d.height/2)-30),0,-1*((d.height/2)-20)); 
                g.drawLine(8,-1*((d.height/2)-30),0,-1*((d.height/2)-20)); 
                g.setFont(fb); 
                g.drawString("x",(d.width/2)-30,-12); 
                g.drawString("y",12,-1*((d.height/2)-30)); 
                g.setFont(f);       
                for(int i=0;i>-1*((d.width/2)-30);i-=20){ 
                    g.drawLine(i,3,i,-3); 
                    if(i!=0){ g.drawString(" "+(i/20)+" ",i-10,15);  } 
                    else if(i==0){ g.drawString("0",i-10,10); } 
                } 
                for(int i=0;i<((d.width/2)-30);i+=20){ 
                    g.drawLine(i,3,i,-3); 
                    if(i!=0){ g.drawString(" "+(i/20)+" ",i-5,15);   } 
                } 
                for(int i=0;i>-1*((d.height/2)-30);i-=20){ 
                    g.drawLine(3,i,-3,i); 
                    if(i!=0){ g.drawString(" "+(-1*(i/20))+" ",-24,i+5);   } 
                } 
                for(int i=0;i<((d.height/2)-30);i+=20){ 
                    g.drawLine(3,i,-3,i); 
                    if(i!=0){ g.drawString(" "+(-1*(i/20))+" ",-24,i+5);    } 
                }  
                
               
              
                 if(an!=0){                 
                    g.setFont(fb); 
                    g.setColor(Color.red); 
                    g.drawString("x1="+an+"* x2 +"+bn+"",-1*((d.width/2)-30),-1*((d.height/2)-12)); 
                    for(int i=-1*((d.width/2)-20);i<=(d.width/2)-20;i++){ 
                        y=(int) (float) (-20*(an*i+bn)); 
                        c=(int) (float) (-20*(an*(i+1)+bn)); 
                        if (y>=-1*((d.height)+100) && c<=(d.height)+50 && y<=(d.height)+50 && c>=-1*((d.height)+50)){ 
                            g.setColor(Color.red); 
                            g.drawLine( 20*i, y, 20*(i+1),c); 
                        } 
                    } 
                } 
         
              
                 if(an1!=0){                 
                    g.setFont(fb);
                      g.setColor(Color.blue);
                    g.drawString("x1="+an1+"* x2 +"+bn1+"",-1*((d.width/2)-30),-1*((d.height/2)-42)); 
                    for(int i=-1*((d.width/2)-20);i<=(d.width/2)-20;i++){ 
                        y=(int) (float) (-20*(an1*i+bn1)); 
                        c=(int) (float) (-20*(an1*(i+1)+bn1)); 
                        if (y>=-1*((d.height)+100) && c<=(d.height)+50 && y<=(d.height)+50 && c>=-1*((d.height)+50)){ 
                            g.setColor(Color.blue); 
                            g.drawLine( 20*i, y, 20*(i+1),c); 
                        } 
                    } 
                }
                     
                   
                 if(an2!=0){                 
                    g.setFont(fb); 
                    g.setColor(Color.green);
                    g.drawString("x1="+an2+"* x2 +"+bn2+"",-1*((d.width/2)-30),-1*((d.height/2)-72)); 
                    for(int i=-1*((d.width/2)-20);i<=(d.width/2)-20;i++){ 
                        y=(int) (float) (-20*(an2*i+bn2)); 
                        c=(int) (float) (-20*(an2*(i+1)+bn2)); 
                        if (y>=-1*((d.height)+100) && c<=(d.height)+50 && y<=(d.height)+50 && c>=-1*((d.height)+50)){ 
                            g.setColor(Color.green); 
                            g.drawLine( 20*i, y, 20*(i+1),c); 
                        } 
                    } 
                }
                
                 
              int xPoints[] = {(int)an, (int)an1,(int) an2}; 
               int yPoints[] = {(int)bn, (int)bn1,(int) bn2};  
                 
               g.fillPolygon(xPoints, yPoints, c);
              
               
                
              
            } 
            catch (NumberFormatException e) 
            { 
                Font bug = new Font( "SansSerif", Font.BOLD, 20); 
                g.setFont(bug); 
                g.setColor(Color.black); 
                g.drawString("SPRAWDZ DANE",-1*((d.width/2)-300),-30); 
            } 
        } 
    } 
    
  
        public void actionPerformed(ActionEvent e){ 
            getParent().repaint(); 
        } 
}       
public class Wykresy{ 
    public static void main(String args[]){ 
        
       // int i = (int)f;
        
        final JFrame okno = new JFrame("Ap");  
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                                             
        JLabel ramka = new JLabel("Metoda graficzna ", JLabel.CENTER); 
        ramka.setPreferredSize(new Dimension(400,25)); 
                                                            
        JPanel panel = new JPanel();       
        JLabel opis0 = new JLabel(" ", JLabel.RIGHT); 
        
                                               
                                                
        JLabel opis1 = new JLabel("x1 = ", JLabel.RIGHT); 
        JLabel opis1a = new JLabel("x2    +   ", JLabel.CENTER); 
        JLabel opis2 = new JLabel("x1 = ", JLabel.RIGHT); 
        JLabel opis2a = new JLabel("x2   +  ", JLabel.CENTER); 
        JLabel opis2b = new JLabel(" ", JLabel.CENTER); 
        JLabel opis3 = new JLabel(" ", JLabel.CENTER);
        JLabel opis3bis = new JLabel("      x1 = ", JLabel.RIGHT);
        JLabel opis3a = new JLabel("x2   +   ", JLabel.CENTER); 
        JLabel opis3b = new JLabel("<- Ograniczenie -3x1 - 2x2 ", JLabel.CENTER);
        
                                                           
        JTextField parametr1 = new JTextField("0.5"); 
        JTextField parametr2 = new JTextField("-1"); 
        
        JTextField parametr3 = new JTextField("-2"); 
        JTextField parametr4 = new JTextField("8");
       
        JTextField parametr5 = new JTextField("-0.6");
        JTextField parametr6 = new JTextField("6");
         
       
           
           
        JButton przyciskRysuj = new JButton("Rysuj wykresy");  // Tworzy przycisk 'Rysuj' 
        panel.setLayout(new GridLayout(3,6));  
        panel.add(opis1);                      
        panel.add(parametr1);                  
        panel.add(opis1a);      
        panel.add(parametr2); 
        panel.add(opis0); 
        panel.add(przyciskRysuj); 
        panel.add(opis2); 
        panel.add(parametr3); 
        panel.add(opis2a);      
        panel.add(parametr4); 
        panel.add(opis2b);
        panel.add(opis3); 
        panel.add(opis3bis);
        panel.add(parametr5); 
        panel.add(opis3a);      
        panel.add(parametr6); 
        panel.add(opis3b);
                                               
        JPanel panelGraf = new JPanel(); 
        panelGraf.setLayout(new GridLayout(1,3)); 
        PanelGrafi panelGrafi = new PanelGrafi(parametr1,parametr2,parametr3,parametr4,parametr5,parametr6); 
 
        
                                    
        
        panelGraf.add(panelGrafi); 
  
        
        przyciskRysuj.addActionListener(panelGrafi); 
        Container wnetrzeOkna = okno.getContentPane(); 
        wnetrzeOkna.add(ramka,       BorderLayout.NORTH); 
        wnetrzeOkna.add(panel, BorderLayout.SOUTH); 
        wnetrzeOkna.add(panelGraf, BorderLayout.CENTER); 
        okno.setExtendedState (Frame.MAXIMIZED_BOTH);  
        okno.setVisible(true); 
    } 
}
0

Nie wiem co to jest pole przecięcia prostych, ale przypuszczam, że przydatna będzie metoda (z klasy Graphics2D) fill(Shape).

0

Pole przecięcia prostych to chyba punkt przecięcia jeśli dobrze rozumiem.

0

Chodzi o to ze jak program narysuje 3 wykresy funkcji linioweych to ja bym chciał zeby przestrzen pomiedzy nimi była zamalowana. I to pole to jest zbiór rozwiązn optymalych dla tych funkcji.

0

Wyznacz punkty przecięcia linii i narysuj wypełniony trójkąt o współrzędnych w tych punktach. Najlepiej przed (pod) rysowaniem właściwych linii.

0

No tylko własnie nie wiem jak :)

0

Umiesz czytać? Napisałem żebyś użył metody fill(Shape), Shape może być np trójkątem. http://docs.oracle.com/javase/7/docs/api/java/awt/Polygon.html.

0

Przeciez pisze, ze gdybym wiedział jak to dokładnie zastosowac to bym to zrobił, ale mi to nie działa i dlatego poprosiłem o pomoc. O wypełnaniu to juz sie naczytałem ale i tak mi nic nie zaznacza dlatego dałem kod zeby ktos mogł mi to poprawic.

0

W tym wywołaniu

g.fillPolygon(xPoints, yPoints, c);

c powinno być ilością wierzchołków wielokąta (u Ciebie 3). Chyba tak nie jest.

0
g.setColor(kolor_jakim_chcesz_wypełniać);
g.fillPolygon(xPoints, yPoints, 3);
0

Czyli jak rozumiem Twoj problem polega na tym, ze nie wiesz jak wyznaczyc ten obszar ?

Jeśli tak to obszar bedzie ograniczony przez 3 punkty = przeciecie prostych l1 z l2, l2 z l3 i l3 z l1

Przedstaw prostą w postaci Ax + By + C = 0
Wtedy punktem P(x;y) przeciecia dwóch prostych bedzie: x= (b1c2-b2c1)/(a1b2-a2b1) a y=(c1a2-c2a1)/(a1b2-a2b1)

Punkty masz gotowe, teraz tylko wypelnic kolorem - metode ktos podal wyzej ;)

  • jeszcze warto sprawdzic czy proste sie nie pokrywaja lub sa rownolegle ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1