6.2 GRAPHICS VE GRAPHICS2D SINIFLARI
6.7 ÇİZİLEN ŞEKİLLERİN DEĞİŞTİRİLEREK ÇİZİMİ (TRANSFORM)
6.9 ÇİZİMİN SEÇİLEN BİR RESİMLE DOLDURULMASI
6.11 GENELLEŞTİRİLMİŞ EĞRİ ÇİZİMİ
Daha önce applet çizerken java.awt kütüphanesi ndeki grafik (Graphics) sınıfı nı kullanmıştık. Ve grafik (Graphics) sinifinina ait drawString metotunu kullanarak applete yazı yazdırmıştık. Şimdi bu sınıfın diğer özelliklerini ve metotlarını öğreneceğiz.
Graphics sınıfı java.lang.Object sınıfının altında yer alır. Bu gurupta aynı zamanda grafik çiziminin çeşitli fazlarında kullanılan java.awt.Color, java.awt:Font, java.awt.FontMetrics, java.awt, java.awt.Graphics, java.awt.Polygon yer alır. Daha detaylı grafik çizme işlemleri tanımlayabilen java.awt. Graphics2D paketi java.awt.Graphics paketinden türetilmiştir. Ayrıca java.awt.BasicStroke, java.awt.GradientPaint, java.awt.TexturePaint gibi temel grafik alt programları da java.lang.Object altında tanımlanmıştır. Temel şekilleri çizdirmeye yarayan java.awt.geom.GeneralPath, java.awt.geom.Line2D, java.awt.geom.RectangularShape de java.lang.Object altında tanımlanır. java.awt.geom.Arc2D, . java.awt.geom.Ellipse2D, . java.awt.geom.Rectangle2D, . java.awt.geom.RoundRectangle2D gibi çizim paketleri de java.awt.geom.RectangularShape paketinin alt paketleri olarak tanımlanmıştır.
Graphics sınıfı, yazı yazma, çizgi çizme, dikdörtgen, oval çizme gibi bir dizi metotu barındırır. Bunun dışında awt kütüphanesinin önemli bir sınıfı da Color sınıfıdır. Color sınıfı rekleri tanımlar ve değişik renklerin kullanımına imkan verir. Font sınıfı grafikte kullanılan yazıların fontlarının (yazı tipinin ve boyutunun) belirlenmesi amacıyla kullanılır. FontMetrics sınıfı fontların boyutlarının belirlenmesiyle ilgili metotları içerir. Polygon sınıfı polygon çizimiyle ilgili metotları barındırır. Bu metodların bir kısmını burada göreceğiz. Temel olarak Graphics ve Graphics2D sınıflarını grafik çiziminde kullanacağız, Bu işlemi yaparken de diğer tüm yardımcı grafik sınıflarından yararlanacağız. Graphics2D sınıfı daha yeni olarak tanımlanmış ve Graphics sınıfından türetilmiş bir sınıftır. Fakat çok daha komleks grafik çizim kapasitelerini barındırır.
Java appletlerinde çizim yaparken ilk hatırlamamız gereken nokta, koordinat merkezinin ekranın sol üst köşesi olduğudur. X ekseni sola doğru, Y ekseni aşağıya doğru gider.
06001.JPG
Şekil 6.1 Java grafik koordinat sistemi, x ve y eksenleri
Y ekseninin alta doğru gitmesi konsol programlarında (ve ilk konsol programlama ortamı olan satır yazıcılarında) satırların alta dogru ilerlemesi gibi tarihi bir nedene dayanmaktadır. Bütün bilgisayar diileri ve ekranı grafik programlamalarında standartdır.
Graphics sınıfı grafik çizimi için gerekli olan bir çok metotu içinde barındırır. Grafik sınıfı java.lang.Object sınıfının alt sınıflarındandır. Grafik çizme amacıyla genellikle Graphics sınıfından bir nesne paint veya paintComponent metotunun içinde çağırılır. Paint metotunun tanımı şöyledir
public void paint (Graphics g)
Bu tanım Applet, Japplet,JFrame extend etmiş programlardan çağırılabilir. Paint metodu tüm bu üç sınıfın türetildiği Component sınıfında tanımlanmıştır. javax.swing sınıfı altında tanımlanan JComponent sınıfında ise paintComponent metodu tanımlanmıştır. JComponentin alt metodu JPanel bu metodu kullanır. Tanımı paint metoduna benzer
public void paintComponent (Graphics g)
paint veya paintComponent metodları Applet, Japplet, Frame, JFrame, Panel, JPanel sınıfları tarafından direk olarak program açıldığında çağırılır. Kullanıcı tarafından çağırılmaz. Tekrar kullanıcı tarafından çağırılması gerektiğinde ise repaint metotu kullanılır ve repaint metotu üzerinden indirek olarak paint metotu çağırılır. Bu metodun tanımı :
public void repaint ()
şeklindedir.
İkinci ilginç metod update metodudur. Bu metod
public void update (Graphics g)
şeklinde tanımlanmıştır. Update metodu çağırıldığında Graphics metodu sistem tarafından otomatik olarak gönderilir. Graphics2D sınıfı Graphics sınıfının bir alt sınıfı olarak tanımlanmıştır. Bu sınıf Graphicss sınıfına göre çok daha kompleks çizimler yapabilen metodlara sahiptir. Burada graphics ve Graphics2D de yer alan bazı sınıf ve çizim tekniklerini yakından inceleyeceğiz.
6.1.1 drawString , drawChars ve drawBytes metotları
Graphics sınıfının altmetodları olan bu metotların tanımları şu şekilde verilmiştir.
public abstract void
drawString( String stringYazı, int x,int y)
public void drawChars( char charYazı[], int baslangıçindeksi,int
yazılacakharfsayısı, int x,int y)
public void drawBytes( byte byteYazı[],
int başlangıçindeksi,int yazılacakharfsayısı, int x,int y)
drawString metotu bir string değişkenini verilen x ve y koordinatlarından başlayarak çizer.
DrawChars bir boyutlu Char tipi değişken dizisini başlangiçindeksi indeksinden baslayarak yazılacakharfsayısı kadar kısmını x ve y koordinatlarından başlıyarak çizer. DrawByte metotu da drawChars metotu gibidir tek değişikliği Byte türü boyutlu değişken kullanmasıdır.
Program 6.1. de bu metotların kullanılmasını açıklayan bir program verilmiştir.
Program 6.1 : ciz.java programı : drawString,drawChars,drawBytes
metotlarının kullanılması
import java.applet.Applet;
import java.awt.*;
public class ciz extends Applet
{
private String s ="Bunu drawString Metoduyla yazdır";
private char c[]={'c','h','a','r','s',' ','8'};
private byte b[]={'b','y','t','e',25,26,27};
public void paint(Graphics g)
{
g.setColor(new Color(0,0,100));
g.setFont(new Font("SansSerif",Font.PLAIN,24));
g.drawString(s,100,25);
g.drawChars(c,2,3,100,50);
g.drawBytes(b,0,5,100,75);
}
}
06002.JPG
Şekil 6.2 drawString drawChars drawBytes metotlarını kullanan ciz
programının
Applet çıktısı
Şimdi aynı işlemi ve aynı metodları Graphics2D üzerinden yaptıralım :
Program 6.2 : ciz2DSWF_2000.java programı : drawString,drawChars,drawBytes metotlarının swing JFrame ve Graphics2D ile birlikte kullanılması
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import renk;
public class ciz2DSWF_2000 extends JFrame {
final static Color bg = Color.white;
final static Color fg = Color.black;
final static Color red = Color.red;
final static Color white = Color.white;
private String s ="Bunu drawString Metoduyla yazdır";
private char c[]={'k','a','r','e','k','t','e','r','l','e','r'};
public ciz2DSWF_2000()
{
//Initialize drawing colors
super("String character çizimi");
setBackground(bg);
setForeground(fg);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setFont(new Font("TimesRoman",Font.BOLD,14));
g2.drawString(s,100,50);
//ikinci charecterden başlayarak 5 character yaz.
g2.drawChars(c,2,5,100,100);
}
//=====================================================
public static void main(String[] args)
{
ciz2DSWF_2000 pencere= new ciz2DSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(350,200);
pencere.setVisible(true);
}
}
Burada hemen belirtelimki swing sınıflarını kullanırken Graphics2D sınıfları kullanmak zorunda değiliz, ama burada genel olarak swing ve Graphics2D kullanımlarını birlikte sunacağız. Bu programın çıktısı da bir önceki programın çıktısında olduğu gibidir :
06003.JPG
Şekil 6.3 drawString
drawChars metotlarını kullanan ciz2DSWF_2000 programının
swing JFrame çıktısı
Programdan da görüleceği gibi paint metodu yine Graphics cinsinden çağırılmakta , daha sonra
Graphics2D g2 = (Graphics2D)g;
Kullanılarak adres Graphics2D sınıfından nesneye yüklenmektedir.
Appletlerde renk controlu Color sınıfını kullanarak yapılır. Renk olusumunda monitör ve Televizyon sistemlerinde kullanılan RG B ( Red- Green-Blue = Kırmızı- Yesil - Mavi ) sistemi temel alınır. Bu üç renk monitorde 0-255 arası değerler alabilir. Üç rengin karışımı toplam 256*256*256 renk tanımlar.
Color sınıfı kurucu metotları şu şekilden tanımlanır.
public Color( int kirmizi,int yesil,int mavi) //her renk 0-255 arası
public Color(float kirmizi,float yeşil,float mavi) //her renk 0.0-1.0 arası
Color sınıfında ayrıca renk degerlerini okuyabildiğimiz
public int getRed()
// Kırmızı tonunu oku
public int getGreen()//Yesil tonunu oku
public int getBlue()//Mavi tonunu oku
public abstract Color getColor() //rengi oku
metotları ve rengi değiştirebildiğimiz
public abstract Color setColor(Color c)
metotu mevcuttur. Color sınıfında sabit olarak tanımlanmış :
Tablo 6.1 Color sınıfında tanımlanmış sabir renkler
Renk sabiti |
Renk |
RGB değeri |
---|---|---|
Public final static Color Orange |
Portakal |
255,200,0 |
Public final static Color pink |
Pembe |
255,175,175 |
public final static Color cyan |
Camgöbeği |
0,255,255 |
public final static Color magenta |
Mor |
255,0,255 |
public final static Color yellow |
Sarı |
255,255,0 |
public final static Color black |
Siyah |
0,0,0 |
public final static Color white |
Beyaz |
255,255,255 |
public final static Color gray |
Gri |
128,128,128 |
public final static Color lightGray |
Açık gri |
192,192,192 |
public final static Color darkGray |
Koyu Gri |
64,64,64 |
public final static Color red |
Kırmızı |
255,0,0 |
public final static Color green |
Yeşil |
0,255,0 |
public final static Color blue |
Mavi |
0,0,255 |
Color sınıfının daha iyi anlaşılabilmesi amacıyla Color sınıfının bir
alt sınıfı olan renk sınıfını tanımladık.
Program 6.3 : Color sınıfının alt sınıfı renk sınıfını tanımlayan renk.java programı :
import java.io.*;
import java.awt.*;
public class renk extends Color
{
public final static renk kirmizi=new renk(255,0,0);
public final static renk mavi=new renk(0,0,255);
public final static renk siyah=new renk(0,0,0);
public final static renk camgobegi=new renk(0,255,255);
public final static renk koyugri=new renk(64,64,64);
public final static renk gri=new renk(128,138,128);
public final static renk yesil=new renk(0,255,0);
public final static renk acikgri=new renk(192,192,192);
public final static renk mor=new renk(255,0,255);
public final static renk portakal=new renk(255,200,0);
public final static renk pembe=new renk(255,175,175);
public final static renk beyaz=new renk(255,255,255);
public final static renk sari=new renk(255,255,0);
public final static renk acikmavi=new renk(150,206,237);
public final static renk lacivert=new renk(0,0,128);
//burada kendi yeni renginizi tanımlayabilirsiniz.
public renk(float kirmizi,float yesil, float mavi)
{
super(kirmizi,yesil,mavi);
}
public renk(double kirmizi,double yesil, double mavi)
{
super((float)kirmizi,(float)yesil,(float)mavi);
}
public renk(int kirmizi,int yesil, int mavi)
{
super(kirmizi,yesil,mavi);
}
public renk(int RGB)
{
super(RGB);
}
public renk(renk r)
{
super(r.getKirmizi(),r.getYesil(),r.getMavi());
}
public int getKirmizi()
{
return getRed();
}
public int getYesil()
{
return getGreen();
}
public int getMavi()
{
return getBlue();
}
public int getKYM()
{
return getRGB();
}
public Color toColor()
{
return (Color)this;
}
public static renk toRenk(Color r)
{return (renk)r;}
public String toString()
{
return "renk[ kirmizi "+getKirmizi()+" mavi "+getMavi()+" yesil "+getYesil()+"]";
}
//metodlar
//static int HSBtoRGB(float hue,float saturation,float brightness)
//getRed(),getGreen(),getBlue(),getRGB()
}
Renk sınıfını bir çok yerde Color sınıfı yerine kullanabiliriz. Kullanamadığımız durumlarda cast işlemcisi (Color) kullanılabilir.
Applette renk
değiştirdiğimiz küçük bir örnek program yazalım :
Program 6.4 : renkTest.java
import java.awt.*;
import java.applet.Applet;
import renk;
public class RenkTest extends Applet
{
private int kirmizi,yesil,mavi;
public void init()
{
kirmizi=150;
yesil=255;
mavi=125;
// arka palanın rengi mavi olarak veriliyor
setBackground(renk.mavi);
}
public void paint(Graphics g)
{
// yazýnýn rengi 100,255,125 olarak alýndý
g.setColor(new renk(kirmizi,yesil,mavi));
g.drawString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",50,33);
showStatus("Su andaki arkaplan rengi : "+getBackground());
}
}
06004.JPG
Şekil 6.4 Renk.html çıktısı
Bu programda kirmizi değeri 100, yesil değeri 255 ve mavi degeri de 125 alınmış ve setColor deyimiyle yeni renk tanımlanmıştır. Arka plan rengi ise public void setBackground(Color c)
Metotunu kullanarak maviye dönüştürülmüştür.
Aynı programın JApplet eşidi olan, aynı zamanda java komutuyla kendi çerçevesini de oluşturabilen bir eşdeğerini verelim. Renk2D sınıfında Graphics2D sınıfı kullanılmaktadır. Grafik kalitesini karşılaştırabilirsiniz.
Program 6.5 : Renk2D.java programı
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class Renk2D extends JApplet {
private int kirmizi,yesil,mavi;
public void init()
{
kirmizi=100;
yesil=255;
mavi=125;
setBackground(new Color(0,0,255));
setForeground(new Color(kirmizi,yesil,mavi));
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(new Color(kirmizi,yesil,mavi));
g2.drawString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",50,33);
g2.drawString("Su andaki renk : "+g2.getColor(),50,53);
}
public static void main(String s[]) {
JFrame f = new JFrame("Renk2D");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
JApplet applet = new Renk2D();
f.getContentPane().add("Center", applet);
applet.init();
f.pack();
f.setSize(new Dimension(550,100));
f.show();
}
}
Renk2D sınıfının çıktısı :
06005.JPG
Şekil 6.4 Renk2D.java çıktısı
Swing sınıfında renk seçimini yapabilmek amacıyla JColorChooser adlı bir program tanımlanmıştır. Bu programı kullanarak renk grafik kutusunun rengini değiştirebildiğimiz renkSeciciSWF swing JFrame programı aşağıda verilmiştir.
Program 6.6 : renkSeciciSWF_2000 .java
import javax.swing.*; // java swing sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
import java.awt.event.*; // java pencereyi dinleme sinifini cagir
import BasicWindowMonitor;
public class renkSeciciSWF_2000 extends JFrame implements ActionListener
{
// Renk secme ornegi
JButton renkdegistir;
Color r=Color.lightGray;
Container c;
// pencereyi baslatma metodu
public renkSeciciSWF_2000()
{
super("JColorChoser ");
c=getContentPane();
c.setLayout(new FlowLayout()) ;
renkdegistir=new JButton("renk değiştirmek için düğmeye basınız");
renkdegistir.addActionListener(this);
c.add(renkdegistir);
}
// girdi alanindaki olan olaylari dinleme metodu
public void actionPerformed(ActionEvent e)
{ r=JColorChooser.showDialog(this,"Renk seçiniz :",r);
if(r==null)
r=renk.acikgri;
c.setBackground(r);
repaint();
}
//=====================================================
public static void main(String[] args)
{
//ana program
renkSeciciSWF_2000 pencere= new renkSeciciSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(350,200);
pencere.setVisible(true);
}
}
06007.JPG |
|
06008.JPG |
06009.JPG
|
Şekil 6.6-6.9 renkSeciciSWF_2000.java java swing frame programı ve JcolorChooser renk seçme programı
Renk seciciSWF_2000.java programında temel olarak JFrame grafik çıktısı kullanılmıştır. Bu programın içerisinde çağırılan
r=JColorChooser.showDialog(this,"Renk seçiniz :",r);
metodu java kütüphanesinde yer almaktadır. ShowDialog metodu bize Color sınıfındaki renk değişkenini aktarmakta ve
c.setBackground(r);
komutuylada arka plan renklerini değiştirmektedir.
JFrame ve JApplet arasındaki farkı anlamaya biraz daha katkıda bulunması amacıyla aynı programı bir de JApplet olarak verelim :
Program 6.7 : renkSeciciSWA_2000 .java
import javax.swing.*; // java swing sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
import java.awt.event.*; // java pencereyi dinleme sinifini cagir
import BasicWindowMonitor;
public class renkSeciciSWA_2000 extends JApplet implements ActionListener
{
// Renk secme ornegi
JButton renkdegistir;
Color r=Color.lightGray;
Container c;
// pencereyi baslatma metodu
public void init()
{
c=getContentPane();
c.setLayout(new FlowLayout()) ;
renkdegistir=new JButton("renk değiştirmek için düğmeye basınız");
renkdegistir.addActionListener(this);
c.add(renkdegistir);
}
// girdi alanindaki olan olaylari dinleme metodu
public void actionPerformed(ActionEvent e)
{
r=JColorChooser.showDialog(this,"Renk seçiniz :",r);
if(r==null)
r=renk.acikgri;
c.setBackground(r);
repaint();
}
}
JFrame ve JApplet programlarının en büyük farkı JFrame ana programdan (main) çalıştığı halde JApplet’in bir browser programından çalıştırılıyor olmasıdır. Burada da en dış çerçeve dışında JFrame ile aynı görüntüyü elde ederiz.
06010.JPG
Şekil 6.10 renkSeciciSWA_2000.java programının Appletviewer’daki çıktısı
Appletlerde
yazı kontrolu Font sınıfı
nı kullanarak yapılır. Şekil 5.3.1 de java 1.1.5 de kullanılabilecek
tüm yazı stillerinin (font) listesini veren stil.java programını görüyoruz.
Program 6.8 : stil.java programı, java kütüphanesinde mevcut olan yazı sitillerini gösterir
import java.applet.*;
import java.awt.*;
public class stil extends
Applet
{
public void paint(Graphics
g)
{
String stilListesi[];
stilListesi=getToolkit().getFontList()
;
int y=15;
for(int i=0;i<stilListesi.length;i++)
{
g.drawString(stilListesi[i],15,y);
y+=15;
}
}
}
06011.JPG
Şekil 6.11 stil.java programı, java kütüphanesinde mevcut olan yazı
sitillerini gösterir applet programının sonuçları.
Yine aynı programın swing JApplet eşitini verelim :
Program 6.9 : stil2D.java programı, java kütüphanesinde mevcut olan yazı sitillerini gösterir
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class stil2D extends JApplet {
public void init()
{
setBackground(Color.white);
setForeground(Color.black);
}
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
String stilListesi[];
stilListesi=getToolkit().getFontList();
int y=15;
for(int i=0;i<stilListesi.length;i++)
{
g2.drawString(stilListesi[i],15,y);
y+=15;
}
}
public static void main(String s[]) {
JFrame f = new JFrame("stil2D");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
JApplet applet = new stil2D();
f.getContentPane().add("Center", applet);
applet.init();
f.pack();
f.setSize(new Dimension(550,300));
f.show();
}
}
06012.JPG
Şekil 6.12 : stil2D.java program çıktısı
Bu yazı sitillerinden birisi asağıda verilen yazı tiplerinden birisiyle beraber ve verilen belli bir yazı boyutunda gösterilebilir.
public final static
int PLAIN : düz yazı sitili
public final static int BOLD : Kalın yazı sitili
public static int ITALIC : İtalik (yatık) yazı sitili
bu tanımlardaki final sözcüğü bu ifadelerin değişken değil sabit olduğunu gösterir.Font sınıfının kurucu metotu şu şekildedir.
Public Font( String s, int yazı_sitili, int harf_boyutu);
Bir appletin yazı sitili Graphics sınıfındaki setFont metotuyla değiştirilebilir.
Public abstract void setFont(Font f)
Örnek olarak aşağıdaki deyimi verebiliriz :
g.setFont (new Font(“Serif”,Font.BOLD,12);
Şimdi setFont metotunu küçük bir örnekte kullanarak gösterelim :
Program 6.10 : RenkFont.java programı, java kütüphanesindeki Font uygulamasını gösterir
import java.awt.*;
import java.applet.Applet;
public class
RenkFont extends Applet
{
private int kirmizi,yesil,mavi;
public void
init()
{
kirmizi=100;
yesil=255;
mavi=125;
}
public void
paint(Graphics g)
{
g.setColor(new Color(kirmizi,yesil,mavi));
setBackground(new Color(0,0,255));
g.setFont(new Font("TimesRoman",Font.BOLD,36));
g.drawString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",50,33);
showStatus("Su andaki
font : "+g.getFont());
}
}
06013.JPG
Şekil 6.13 RenkFont.html programı, java kütüphanesindeki Font uygulamasını
gösterir
bu programın da Japplet eşdeğerini verelim:
Program 6.11 : RenkFont2D.java swing JApplet programı, java kütüphanesindeki Font uygulamasını gösterir
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class RenkFont2D extends JApplet {
private int kirmizi,yesil,mavi;
public void init()
{
kirmizi=100;
yesil=255;
mavi=125;
setBackground(new Color(0,0,255));
setForeground(new Color(kirmizi,yesil,mavi));
}
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.setColor(new Color(kirmizi,yesil,mavi));
setBackground(new Color(0,0,255));
Font font=g2.getFont();
g2.setFont(new Font(font.getName(),Font.BOLD,24));
g2.drawString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",50,33);
g2.drawString("Su andaki font : "+g.getFont(),50,70);
g2.setFont(new Font(font.getName(),Font.PLAIN,12));
g2.drawString("Su andaki font : "+g.getFont(),50,85);
}
public static void main(String s[]) {
JFrame f = new JFrame("RenkFont2D");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
JApplet applet = new RenkFont2D();
f.getContentPane().add("Center", applet);
applet.init();
f.pack();
f.setSize(new Dimension(550,200));
f.show();
}
}
06014.JPG
Şekil 6.14 RenkFont2D.java JFrame programı, java kütüphanesindeki Font uygulamasını gösterir
Javada çizgi çizmek için kullanılan temel metot Graphics sınıfında drawLine metotu dur. Bu metot Graphics sınıfında tanımlanmıştır. Kurucu metotu :
Public abstract void
drawLine(
int x1, // ilk noktanın x koordinatı
int y1, //ilk noktanın y koordinatı
int x2, // ikinci noktanın x koordinatı
int y2) //ikinci noktanın y koordinatı
Graphics2D sınıfında ise çizgi çiziminde java.awt.geom kütüphanesinde tanımlanan Line2D sınıfı, Graphics2D sınıfındaki draw metoduyla birlikte kullanılır.
Bir küçük örnek problem cizgiciz.java' da drawLine metotunun kullanımını görelim:
Program 6.12 : Çizgi çizim örneği cizgiciz.java
import java.applet.*;
import java.applet.Applet;
import java.awt.*;
public class cizgiciz extends Applet
{
public void paint(Graphics g)
{
g.setColor(new Color(0,0,0));
g.setFont(new Font("SansSerif",Font.PLAIN,24));
g.drawLine(10,10,230,95);
}
}
06015.JPG
Şekil 6.615 ve çizginin appletde görünümü
Şimdi aynı problemin yaklaşık eşidini cizgiSWF_2000.java programında görelim :
Program 6.13 : Çizgi çizim örneği cizgiSWF_2000.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import renk;
public class cizgiSWF_2000 extends JFrame {
final static Color bg = Color.white;
final static Color fg = Color.black;
final static Color red = Color.red;
final static Color white = Color.white;
public cizgiSWF_2000()
{
//Initialize drawing colors
super("çizgi çizimi");
setBackground(bg);
setForeground(fg);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.black);
Line2D l=new Line2D.Double(50,50,100,75);
g2.draw(l);
g2.setStroke(new BasicStroke(1f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,1f,new float[] {5f},0f));
Line2D l1=new Line2D.Double(50,150,100,175);
g2.draw(l1);
}
//=====================================================
public static void main(String[] args)
{
cizgiSWF_2000 pencere= new cizgiSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(350,200);
pencere.setVisible(true);
}
}
06016.JPG
Şekil 6.16 ve çizginin cizgiSWF_2000 JFrame çıktısında görünümü
Bu programdaki temel çizim metodlarına göz atalım :
Graphics2D g2 = (Graphics2D)g;
Graphics sınıfı g nesnesini Graphics2D sınıfi g2 nesnesine aktarır.
g2.setPaint(Color.black);
Grafik çizim rengini siyah olarak tanımlar.
Line2D l=new Line2D.Double(50,50,100,75);
İlk devamlı çizginin koordinatlarını tanımlar
g2.draw(l);
İlk devamli çizgiyi çizer
g2.setStroke(new BasicStroke(1f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,1f,new float[] {5f},0f));
Çizgiyi noktalı çizme komutunu tanımlar
Line2D l1=new Line2D.Double(50,150,100,175);
Noktalı çizginin koordinatlarını tanımlar
g2.draw(l1);
Noktalı çizgiyi çizer.
Burada bizim için yeni bir kavram olan noktalı çizgi çizmenin detaylarına biraz göz atalım. Noktalıçizgi oluşturmak için temel olarak setStroke metodunu kullanıyoruz. Bu metodun içinde Basic Stroke metodu bir nesne yaratıyoruz. BasicStroke türü nesne çizgi kalınlığı, çizgi bağlama sitili,çizgi ucu bitiş sitili ve çizgi-boşluk bilgisi içerir. Çizgi kalınlığı çizgi istikametine dik olarak ölçülür. Çizgi kalınlığı 1f (buradaki f sayının float temel değişken türü olduğunu belitir) 0.35277 milimetreye eşittir. Yalnız transformasyon kullanıldığında bu değişebilir. Transformasyonlara biraz sonra değineceğiz.
Çizgi bağlama sitili iki çizginin birbirine bağlandığı noktadaki şeklini belirler. BasicStroke sınıfında 3 bağlanma sitili mevcuttur. Bunlar :
JOIN_BEVEL
JOIN_MITER
JOIN_ROUND
sitilleridir. Çizgi ucu bitiş sitilleri boş çizgi ucunun şeklini belirtir. Yine temel olarak 3 BasicStroke çizgi ucu bitiş sitili mevcuttur. Bunlar :
CAP_BUTT
CAP_ROUND
CAP_SQUARE
sitilleridir. Çizgi boşluk bilgisi birbirini takip eden şeffaf ve görünür çizgi parçacıkları ve bunların boylarını tanımlar. Bir ara boşluk değişkeni ve çizgi boşluk çizgi boşluk olmak üzere bir seriden oluşur. Son olarak son rakam serinin hangi elemanından çizime başlanacağını gösterir Örneğin:
g2.setStroke(new BasicStroke(1,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,0,new float[] {10,5,2,5},0));
10 boyutu bir çizgi 5 boşluk 2 boyutu çizgi 5 boşluk belirtir.
g2.setStroke(new BasicStroke(1,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,5,new float[] {5},0));
5 boşluk ve 5 çizgi belirtir. cizgiSWF_2000.java programında çeşitli stoke tiplerini deneyebilirsiniz.
Java Graphics sınıfında dikdörtgen çizmek için kullanılan temel metot drawRect metotudur. Bu metot Graphics sınıfında tanımlanmıştır. Bu metotların tanımı :
Public abstract void
drawRect(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // dikdörgenin genişliği
int yukseklik) // dikdörtgenin yüksekliği
Bu metota ilave olarak dikdörtgenin içini verilen renkte boyayan
Public abstract void
fillRect(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // dikdörgenin genişliği
int yukseklik) // dikdörtgenin yüksekliği
ve dikdörtgeni arkaplan renginde boyayan (silen)
Public abstract void
clearRect(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // dikdörgenin genişliği
int yukseklik) // dikdörtgenin yüksekliği
metotları mevcuttur. DrawRect ve fillRec metotunun kullanımı Program 6.6
da verilmiştir.
Program 6.14 :
dikdortgenCiz.java
import java.applet.Applet;
import java.awt.*;
public class
dikdortgenCiz extends Applet
{
public void paint(Graphics
g)
{
g.setColor(new Color(255,0,0));
g.drawRect(10,10,100,50);
g.fillRect(129,10,100,50);
}
}
06017.JPG
Şekil 6.17 dikdortgenCiz.java programı ve dikdortgenCiz.html appleti
Graphics2D metodunda dikdörtgen çizmek için
g2.draw(new Rectangle2D.Double(x, y,dikdortgenEn,dikdortgenYukseklik));
kullanılır.
Dikdörtgenin içini maviye boyamak için
g2.setPaint(Color.blue);
Rectangle2D dikdortgen2=new Rectangle2D.Double(50,50,100,40);
g2.fill(dikdortgen2);
kullanılabilir. Graphics2D de tek renk yerine değişen bir renk profiliyle boyamak da mümkündür. Örneğin :
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
GradientPaint kirmizidanbeyaza=new GradientPaint(250,50,kirmizi,350,90,beyaz);
g2.setPaint(kirmizidanbeyaza);
Rectangle2D dikdortgen4=new Rectangle2D.Double(250,50,100,40);
g2.fill(dikdortgen4);
kodu dikdörtgeni kırmızıdan beyaza dönüşen bir spekturumla boyar. Tüm bu kodu bir örnek problemde gösterelim :
Program 6.15 : dikdortgenSWF-2000.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class dikdortgenSWF_2000 extends JFrame {
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public dikdortgenSWF_2000()
{
super("Dikdörtgen çizimi");
setBackground(Color.lightGray);
setForeground(siyah);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.blue);
Rectangle2D dikdortgen1=new Rectangle2D.Double(55,55,90,30);
g2.fill(dikdortgen1);
g2.setPaint(siyah);
Rectangle2D dikdortgen2=new Rectangle2D.Double(50,50,100,40);
g2.draw(dikdortgen2);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,3f,new float[] {10f},0f));
g2.setPaint(Color.black);
Rectangle2D dikdortgen3=new Rectangle2D.Double(50,150,100,40);
g2.draw(dikdortgen3);
GradientPaint kirmizidanbeyaza=new GradientPaint(250,50,kirmizi,350,90,beyaz);
g2.setPaint(kirmizidanbeyaza);
Rectangle2D dikdortgen4=new Rectangle2D.Double(250,50,100,40);
g2.fill(dikdortgen4);
GradientPaint kirmizidanmaviye=new GradientPaint(250,150,kirmizi,350,190,Color.blue);
g2.setPaint(kirmizidanmaviye);
Rectangle2D dikdortgen5=new Rectangle2D.Double(250,150,100,40);
g2.fill(dikdortgen5);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,1f,new float[] {5f},0f));
g2.setPaint(Color.black);
g2.draw(dikdortgen5);
}
//=====================================================
public static void main(String[] args)
{
dikdortgenSWF_2000 pencere= new dikdortgenSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
Bu programın çıktısı :
06018.JPG
Şekil 6.18 çeşitli dikdörtgen çizimlerinin dikdortgenSWF_2000 JFrame çıktısında görünümü
Graphics sınıfında Köşeleri yuvarlatılmış dikdörtgen çizmek içinse drawRoundRect metotu kullanılır
Public abstract void
drawRoundRect(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // dikdörgenin genişliği
int yukseklik, // dikdörtgenin yüksekliği
int koseeni, // yuvarlak kosenin eni
int koseyuksekligi )// yuvarlak kosenin yuksekligi
Bu metota ilave olarak dikdörtgenin içini verilen renkte boyayan
Public abstract void
fillRoundRect(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // dikdörgenin genişliği
int yukseklik, // dikdörtgenin yüksekliği
int koseeni, // yuvarlak kosenin eni
int koseyuksekligi )// yuvarlak kosenin yuksekligi
metotu da paralel olarak tanımlanmıştır. Yine bir örnek problemde bu tanımı kullanacak olursak :
Program 6.16 : yuvarlakKoseliDikdortgenCiz.java programı
import java.applet.Applet;
import java.awt.*;
public class yuvarlakKoseliDikdortgenCiz
extends Applet
{
public void paint(Graphics g)
{
g.setColor(new Color(0,0,255));
g.setFont(new Font("SansSerif",Font.PLAIN,12));
g.drawRoundRect(10,10,100,100,15,15);
g.fillRoundRect(120,10,100,100,15,15);
}
}
06019.JPG
Şekil 6.19 yuvarlakKoseliDikdortgenCiz.html appleti
Graphics2D sınıfında koşeleri yuvarlatılmış dikdörtgen çizmek için :
g2.draw(new Rectangle2D.Double(x, y,dikdortgenEn,dikdortgenYukseklik,xKöşeYarıçapı,yKöşeYarıçapı));
metodları kullanılır. Rakamsal örnek verirsek :
g2.setPaint(Color.blue);
RoundRectangle2D dikdortgen2=new RoundRectangle2D.Double(50,50,100,40,15,15);
g2.draw(dikdortgen2);
kullanılabilir. Dikdörtgenin içini boyamak içinse:
g2.setPaint(Color.blue);
RoundRectangle2D dikdortgen2=new RoundRectangle2D.Double(50,50,100,40,15,15);
g2.fill(dikdortgen2);
kodu kullanılabilir. Elbette bir önceki örnekte olduğu gibi spektrumlu boyama da mümkündür. Tüm bu kodu bir örnek problemde gösterelim
Program 6.17 : yuvarlakKoseliDikdortgenSWF_200 0.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class yuvarlakKoseliDikdortgenSWF_2000 extends JFrame {
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public yuvarlakKoseliDikdortgenSWF_2000()
{
super("Yuvarlak Köşeli Dikdörtgen Çizimi");
setBackground(Color.lightGray);
setForeground(siyah);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.blue);
RoundRectangle2D dikdortgen1=new RoundRectangle2D.Double(55,55,90,30,15,15);
g2.fill(dikdortgen1);
g2.setPaint(siyah);
RoundRectangle2D dikdortgen2=new RoundRectangle2D.Double(50,50,100,40,15,15);
g2.draw(dikdortgen2);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,3f,new float[] {10f},0f));
g2.setPaint(Color.black);
RoundRectangle2D dikdortgen3=new RoundRectangle2D.Double(50,150,100,40,15,15);
g2.draw(dikdortgen3);
GradientPaint kirmizidanbeyaza=new GradientPaint(250,50,kirmizi,350,90,beyaz);
g2.setPaint(kirmizidanbeyaza);
RoundRectangle2D dikdortgen4=new RoundRectangle2D.Double(250,50,100,40,15,15);
g2.fill(dikdortgen4);
GradientPaint kirmizidanmaviye=new GradientPaint(250,150,kirmizi,350,190,Color.blue);
g2.setPaint(kirmizidanmaviye);
RoundRectangle2D dikdortgen5=new RoundRectangle2D.Double(250,150,100,40,15,15);
g2.fill(dikdortgen5);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,1f,new float[] {5f},0f));
g2.setPaint(Color.black);
g2.draw(dikdortgen5);
}
//=====================================================
public static void main(String[] args)
{
yuvarlakKoseliDikdortgenSWF_2000 pencere=
new yuvarlakKoseliDikdortgenSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
06020.JPG
Şekil 6.20 çeşitli köşesi yuvarlatılmış dikdörtgen çizimlerinin yuvarlakKoselidikdortgenSWF_2000 JFrame çıktısında görünümü
Graphics’de 3 boyutlu dikdortgen çizen draw3DRect ve fill3Drect metotları mevcutttur. Bu metotların tanımları şu şekilde verilmiştir.
Public abstract void
draw3DRect(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // dikdörgenin genişliği
int yukseklik, // dikdörtgenin yüksekliği
boolean yukarıkaldırma) // yukarı kalkık 3üncü boyut
Public abstract void
fill3DRect(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // dikdörgenin genişliği
int yukseklik, // dikdörtgenin yüksekliği
boolean yukarıkaldırma) // yukarı kalkık 3üncü boyut
Program 61.8 : ucBoyutluDikdortgenCiz.java programı
import java.applet.Applet;
import java.awt.*;
public class
ucBoyutluDikdortgenCiz extends Applet
{
public void paint(Graphics g)
{
g.setColor(Color.yellow);
g.setFont(new Font("SansSerif",Font.PLAIN,12));
g.draw3DRect(10,10,100,100,true);
g.fill3DRect(120,10,100,100,true);
g.draw3DRect(10,120,100,100,false);
g.fill3DRect(120,120,100,100,false);
}
}
06021.JPG
Şekil 6.21 ucBoyutluDikdortgenCiz. html appleti
Graphics2D sınıfında çizilen şekiller dinamik olarak değiştirilebilirler. Bu değişimler döndürme, köşedençekip uzatma gibi değişik işlemler olabilir. Bu değiştirme prosesini önce bir örnekle gösterelim, sonrada izah etmeye çalışalım.
Program 6.19 : donmusDikdortgenSWF-2000.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class donmusDikdortgenSWF_2000 extends JFrame {
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public donmusDikdortgenSWF_2000()
{
super("Dödürülmüş - çekilmiş Dikdörtgen çizimleri");
setBackground(Color.lightGray);
setForeground(siyah);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.blue);
Rectangle2D dikdortgen1=new Rectangle2D.Double(55,55,90,30);
AffineTransform at= AffineTransform.getRotateInstance(45,50,50);
g2.setTransform(at);
g2.fill(dikdortgen1);
g2.setPaint(siyah);
Rectangle2D dikdortgen2=new Rectangle2D.Double(50,50,100,40);
g2.draw(dikdortgen2);
g2.setTransform(new AffineTransform());
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,3f,new float[] {10f},0f));
g2.setPaint(Color.black);
Rectangle2D dikdortgen3=new Rectangle2D.Double(50,150,100,40);
AffineTransform at1= AffineTransform.getScaleInstance(1.5,1.5);
g2.setTransform(at1);
g2.draw(dikdortgen3);
g2.setTransform(new AffineTransform());
GradientPaint kirmizidanbeyaza=new GradientPaint(250,50,kirmizi,350,90,beyaz);
g2.setPaint(kirmizidanbeyaza);
Rectangle2D dikdortgen4=new Rectangle2D.Double(250,50,100,40);
AffineTransform at2= AffineTransform.getShearInstance(0.4,0);
g2.setTransform(at2);
g2.fill(dikdortgen4);
g2.setTransform(new AffineTransform());
GradientPaint kirmizidanmaviye=
new GradientPaint(250,150,kirmizi,350,190,Color.blue);
g2.setPaint(kirmizidanmaviye);
Rectangle2D dikdortgen5=new Rectangle2D.Double(250,150,100,40);
g2.fill(dikdortgen5);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,1f,new float[] {5f},0f));
g2.setPaint(Color.black);
AffineTransform at3= AffineTransform.getTranslateInstance(0.0,10.0);
g2.setTransform(at3);
g2.draw(dikdortgen5);
g2.setTransform(new AffineTransform());
}
//=====================================================
public static void main(String[] args)
{
donmusDikdortgenSWF_2000 pencere= new donmusDikdortgenSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
06022.JPG
Şekil 6.22 çeşitli şekli değiştirilmiş dikdörtgen çizimlerinin donmusDikdortgenSWF-2000 JFrame çıktısında görünümü
AffineTransform at= AffineTransform.getRotateInstance(x,y,açıDerece);
Şekli x,y noktası etrafında açıDerece kadar saat akranının tersi yönde döndürür.
AffineTransform at2= AffineTransform.getShearInstance(xÇekişi,yÇekişi);
Şekli x ekseninde xÇelişi kadar, y ekseninde yÇekişi kadar uzatır (orijinal şekilden elastik ve üst köşesi tutturulmuş şekilde)
AffineTransform at1= AffineTransform.getScaleInstance(xBoyutFaktörü,yBoyutFaktörü);
Şeklin boyutunu xBoyutFaktörü,yBoyutFaktörü faktörleriyle çarparak büyütür.
AffineTransform at3= AffineTransform.getTranslateInstance(xTaşımaFaktörü,yTaşımaFaktörü);
Şekli yerinden hareket ettirir. Orijinal transforma geri dönmek için :
g2.setTransform(new AffineTransform());
metodu çağırılabilir.
Graphics sınıfıOval
çizimi için drawOval ve fillOval metotları kullanılır bu metotların tanımı
şöyledir :
Public abstract
void drawOval
(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // ovalin genişliği
int yukseklik) // ovalin yüksekliği
Public abstract
void fillOval(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // ovalin genişliği
int yukseklik) // ovalin yüksekliği
(x1,y1) koordinatının ovalle ilişkisini daha iyi anlayabilmek için aşağıdaki grafiği verebiliriz :
06023.JPG
Şekil 6.23 Oval tanımı koordinat sistemi
Oval programını küçük
bir örnek programda kullanalım :
Program 6.20 : daireCiz.java programı
import java.applet.Applet;
import java.awt.*;
public class daireCiz extends Applet
{
public void paint(Graphics
g)
{
g.setColor(new Color(0,0,255));
g.drawOval(10,10,50,50);
g.fillOval(70,10,50,50);
}
}
06024.JPG
Şekil 6.24 daireCiz.html apleti
Graphics ile bir ovalin tamamını değilde sadece bir bölümünü çizmek dilenilirse, drawArc ve fillArc metotları kullanılabilir. Bu metotların tanımı :
Public abstract void
drawArc(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // ovalin genişliği
int yukseklik, // ovalin yüksekliği
int başlangıçaçısı, //arkın başlangıç açısı, derece
int çizimaçısı) // arkın çizim açısı, derece
Public abstract void
fillArc(
int x1, // üst tepe noktanın x koordinatı
int y1, // üst tepe noktanın y koordinatı
int en, // ovalin genişliği
int yukseklik, // ovalin yüksekliği
int başlangıçaçısı,
//arkın başlangıç açısı, derece
int çizimaçısı) // arkın çizim açısı, derece
Şimdi de bu metotu kullanan
bir bilgisayar programı yazalım :
Program 6.21 : arcCiz.java, arc çizimi programı
import java.applet.Applet;
import java.awt.*;
public class arcCiz extends
Applet
{
public void paint(Graphics
g)
{
g.setColor(new Color(0,0,255));
g.setFont(new Font("SansSerif",Font.PLAIN,12));
g.drawOval(70,10,50,50);
g.drawArc(10,10,50,50,30,60);
g.fillArc(70,10,50,50,30,60);
}
}
06025.JPG
Şekil 6.25 arcCiz.html
apleti
Graphics2D sınıfında oval (elips) çizmek için :
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.blue);
Ellipse2D elips1=new Ellipse2D.Double(x,y,en,yükseklik);
g2.draw(elips1);
kullanabiliriz. İçini boyamak için ise :
g2.fill(elips1);
metodunu kullanırız.
Yine örneğimizde kullanacak olursak :
Program 6.21 : elipsSWF_2000 .java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class elipsSWF_2000 extends JFrame {
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public elipsSWF_2000()
{
super("Elips çizimi");
setBackground(Color.lightGray);
setForeground(siyah);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.blue);
Ellipse2D elips1=new Ellipse2D.Double(55,55,90,30);
g2.fill(elips1);
g2.setPaint(siyah);
Ellipse2D elips2=new Ellipse2D.Double(50,50,100,40);
g2.draw(elips2);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,3f,new float[] {10f},0f));
g2.setPaint(Color.black);
Ellipse2D elips3=new Ellipse2D.Double(50,150,100,40);
g2.draw(elips3);
GradientPaint kirmizidanbeyaza=new GradientPaint(250,50,kirmizi,350,90,beyaz);
g2.setPaint(kirmizidanbeyaza);
Ellipse2D elips4=new Ellipse2D.Double(250,50,100,40);
g2.fill(elips4);
GradientPaint kirmizidanmaviye=new GradientPaint(250,150,kirmizi,350,190,Color.blue);
g2.setPaint(kirmizidanmaviye);
Ellipse2D elips5=new Ellipse2D.Double(250,150,100,40);
g2.fill(elips5);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,1f,new float[] {5f},0f));
g2.setPaint(Color.black);
g2.draw(elips5);
}
//=====================================================
public static void main(String[] args)
{
elipsSWF_2000 pencere= new elipsSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
06026.JPG
Şekil 6.26 çeşitli oval (elips) çizimlerinin elipsSWF_2000JFrame çıktısında görünümü
Graphics2D sınıfında bir grafiği boyarken bir resim dosyasının içinde tanımlanan bir motifi de kullanabiliriz.
Program 6.22 :textureE lipsSWF_2000.java
import javax.swing.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.net.URL;
import java.awt.*;
public class textureElipsSWF_2000 extends JFrame {
TexturePaint tp = getImageTexture("sybex.gif");
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public textureElipsSWF_2000()
{
super("Elips çizimi");
setBackground(beyaz);
setForeground(siyah);
}
public TexturePaint getImageTexture(String imageFile)
{
URL url = getClass().getResource(imageFile);
Image img = getToolkit().getImage(url);
try {
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(img, 0);
tracker.waitForID(0);
} catch (Exception e) {}
int width = img.getWidth(this);
int height = img.getHeight(this);
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = buffImg.getGraphics();
g.drawImage(img, 0, 0, this);
Rectangle2D rect = new Rectangle(0, 0, width, height);
return new TexturePaint(buffImg, rect);
}
//************
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(tp);
Ellipse2D elips1=new Ellipse2D.Double(55,55,90,30);
g2.fill(elips1);
g2.setPaint(siyah);
Ellipse2D elips2=new Ellipse2D.Double(50,50,100,40);
g2.draw(elips2);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,3f,new float[] {10f},0f));
g2.setPaint(Color.black);
Ellipse2D elips3=new Ellipse2D.Double(50,150,100,40);
g2.draw(elips3);
GradientPaint kirmizidanbeyaza=new GradientPaint(250,50,kirmizi,350,90,beyaz);
g2.setPaint(kirmizidanbeyaza);
Ellipse2D elips4=new Ellipse2D.Double(250,50,100,40);
g2.fill(elips4);
g2.setPaint(tp);
Ellipse2D elips5=new Ellipse2D.Double(250,150,100,40);
g2.fill(elips5);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,1f,new float[] {5f},0f));
g2.setPaint(Color.black);
g2.draw(elips5);
}
//=====================================================
public static void main(String[] args)
{
textureElipsSWF_2000 pencere= new textureElipsSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(300,300);
pencere.setVisible(true);
}
//************
}
06027.JPG
Şekil 6.27 çeşitli oval (elips) çizimlerinin ve arkaplan resimli boyama işleminin textureElipsSWF_2000JFrame çıktısında görünümü
Burada texture
sybex.gif dosyasından
public TexturePaint getImageTexture(String imageFile)
metodu kullanılarak aktarılmış ve aynen yeni bir renk gibi çizim ortamında kullanılmıştır.
Şimdi de Graphics2D metoduyla arc çizdirmeye bakalım arc yukarda da bahsettiğimiz gibi tamamlanmamış bir elipstir.
Program 6.23 : arcSWF_2000.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class arcSWF_2000 extends JFrame {
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public arcSWF_2000()
{
super("arc çizimi");
setBackground(Color.lightGray);
setForeground(siyah);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.blue);
Arc2D arc1=new Arc2D.Double(55,55,90,30,90,270,Arc2D.PIE);
g2.fill(arc1);
g2.setPaint(siyah);
Arc2D arc2=new Arc2D.Double(50,50,100,40,90,270,Arc2D.PIE);
g2.draw(arc2);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,3f,new float[] {10f},0f));
g2.setPaint(Color.black);
Arc2D arc3=new Arc2D.Double(50,150,100,40,90,270,Arc2D.PIE);
g2.draw(arc3);
GradientPaint kirmizidanbeyaza=new GradientPaint(250,50,kirmizi,350,90,beyaz);
g2.setPaint(kirmizidanbeyaza);
Arc2D arc4=new Arc2D.Double(250,50,100,40,90,270,Arc2D.PIE);
g2.fill(arc4);
GradientPaint kirmizidanmaviye=new GradientPaint(250,150,kirmizi,350,190,Color.blue);
g2.setPaint(kirmizidanmaviye);
Arc2D arc5=new Arc2D.Double(250,150,100,40,90,270,Arc2D.PIE);
g2.fill(arc5);
g2.setStroke(new BasicStroke(2f,BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND,1f,new float[] {5f},0f));
g2.setPaint(Color.black);
g2.draw(arc5);
}
//=====================================================
public static void main(String[] args)
{
arcSWF_2000 pencere= new arcSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
06028.JPG
Şekil 6.28 çeşitli tamamlanmamış oval (ark) çizimlerinin arcSWF_20000 JFrame çıktısında görünümü
Graphics sınıfında Açık ve kapalı polygon şekilleri çizmek için
drawPolygon
ve fillPolygon
metotları kullanılır. Metotların tanımı :
Program 6.24 : drawPolygon.java
public abstract void
drawPolygon(
int x[], // x koordinat vektörü
int y[], // y koordinatı vektörü
int nokta sayısı) // nokta sayısı
public abstract void
drawPolyline(
int x[], // x koordinat vektörü
int y[], // y koordinatı vektörü
int nokta sayısı) // nokta sayısı
public abstract void
drawPolygon( Polygon p) //Graphics sınıfı metotu
public Polygon() //Polygon
sınıfı
public Polygon(
int x[], // x koordinat vektörü
int y[], // y koordinatı vektörü
int nokta sayısı) // nokta sayısı
Metot tanımlarından da görüldüğü gibi polygon int türü vektörle çizilebileceği gibi bu vektörü içinde barındıran Polygon sınıfı bir nesne kullanılarak ta çizilebilir.
Örnek olarak üçgen çizen bir program verelim :
Program 6.25 : ucgenCiz.java, poligon çizim programı
import java.applet.Applet;
import java.awt.*;
public class ucgenCiz extends Applet
{
public void paint(Graphics g)
{
int x[]={10,(int)(10+100*Math.cos(Math.PI/3.0)),110,10};
int y[]={100,(int)(100-100*Math.sin(Math.PI/3.0)),100,100};
int x1[]={130,(int)(130+100*Math.cos(Math.PI/3.0)),230,130};
int y1[];
y1=y;
g.setColor(new Color(0,0,255));
g.drawPolygon(x,y,4);
g.fillPolygon(x1,y1,4);
}
}
06029.JPG
Şekil 6.29 ucgenCiz.java programı ve apleti
Graphics2D programında grafik çizdirmek için kullanılan metodlar Graphics sınıfına göre oldukça değişiktir. Burada önce örnek programımızı verelim:
Program 6.26 : polygonSWF.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class polygonSWF extends JFrame
{
public polygonSWF()
{
super("Polygon çizimi");
}
public void paint(Graphics g)
{
int x[]={55,67,109,73,83,55,27,37,1,43};
int y[]={0,36,36,54,96,72,96,54,36,36};
Graphics2D g2=(Graphics2D)g;
GeneralPath yildiz=new GeneralPath();
yildiz.moveTo(x[0],y[0]);
for(int i=1;i<x.length;i++)
{yildiz.lineTo(x[i],y[i]);}
yildiz.closePath();
g2.translate(200,200);
for(int i=0;i<20;i++)
{
g2.rotate(Math.PI/10.0);
g2.setColor(new Color((int)(Math.random()*256),(int)(Math.random()*256),
(int)(Math.random()*256)));
g2.fill(yildiz);
g2.setStroke(new BasicStroke(2));
g2.setColor(Color.black);
g2.draw(yildiz);
}
}
public static void main(String[] args)
{
polygonSWF pencere= new polygonSWF();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
06030.JPG
Şekil 6.30 çeşitli yıldızların (polygonun) çizim ve döndürme işlemi polygonSWF JFrame çıktısında görünümü
bu programda önce
int x[]={55,67,109,73,83,55,27,37,1,43};
int y[]={0,36,36,54,96,72,96,54,36,36};
GeneralPath yildiz=new GeneralPath();
yildiz.moveTo(x[0],y[0]);
for(int i=1;i<x.length;i++)
{yildiz.lineTo(x[i],y[i]);}
yildiz.closePath();
ile yıldız tanımlanmış, ve
g2.draw(yildiz);
ile çizilmiş, ve
g2.fill(yildiz);
ile içi boyanmıştır. Ayrıca
g2.translate(200,200); ile çizim başlama noktası 200,200 noktasına kaydırılmış ve
g2.rotate(Math.PI/10.0);
komutu ile döndürülmüştür. Programda setPAint kullanarak tesadüfi renkler seçilmiş ve yıldız çizimi doldurulmuştur.
Programda kullanılan
GeneralPath yildiz=new GeneralPath();
Terimine özellikle dikkatinizi çekmek isteriz. Bu terim GeneralPath nesnesi yıldızı tanımlar.
GeneralPath nesnesi kullanarak polinomdan çok daha kompleks çekiller de tanımlayabiliriz.
Program 6.28 : generalPathSWF_2000 .java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class generalPathSWF_2000 extends JFrame {
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public generalPathSWF_2000()
{
super("ikinci ve üçüncü dereceden genel eğri çizimi");
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
setBackground(Color.lightGray);
setForeground(siyah);
Dimension boyut=getSize();
int dx=boyut.width;
int dy=boyut.height;
g2.setPaint(siyah);
g2.setStroke(new BasicStroke(3));
g2.draw3DRect(0,0,dx-3,dy-3,true);
g2.draw3DRect(3,3,dx-7,dy-7,false);
GeneralPath sekil=new GeneralPath(GeneralPath.WIND_EVEN_ODD);
sekil.moveTo(20,20);
//quadratik ekleme
sekil.quadTo(160,120,245,45);
//kübik ekleme
sekil.curveTo(195,95,295,145,245,195);
sekil.curveTo(-80,110,345,110,20,195);
sekil.curveTo(400,250,200,250,20,20);
g2.draw(sekil);
}
//=====================================================
public static void main(String[] args)
{
generalPathSWF_2000 pencere= new generalPathSWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
06031.JPG
Şekil 6.31 ikinci ve üçüncü dereceden genel eğri çizimi, generalPathSWF_2000, JFrame çıktısında görünümü
Bu çizimdeki çizginin oldukça düzgün olduğuna dikkatinizi çekeriz. Bunu sağlayan temel komut :
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Komutudur. Bu komut çizgileri daha düzgün hale getirir, fakat belli bir hesap ve hafıza kapasitesi harcar. Programı bu komutu çıkararak da çalıştırınız ve aradaki farkları inceleyiniz.
Şekli oluşturan temel komutlar:
GeneralPath sekil=new GeneralPath(GeneralPath.WIND_EVEN_ODD);
sekil.moveTo(20,20);
//quadratik ekleme
sekil.quadTo(160,120,245,45);
//kübik ekleme
sekil.curveTo(195,95,295,145,245,195);
komutlarıdır. Daha sonra bu şekiller
g2.draw(sekil);
komutuyla çizdirilmiştir.
g2.fill(sekil);
komutu burada kullanılmamakla birlikte, geçerli bir komuttur. Programda deneyiniz. Bu programda çizdirilen ikinci dereceden (quadratik eğriler) quadTo ve curveTo metodları kullanılarak oluşturulmuştur. Şimdi de ikinci derece polynom uydurmasını QuadCurve2D sınıfını kullanarak yapan bir programı inceleyelim :
Program 6.29 : curve2SWF_2000 .java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class curve2SWF_2000 extends JFrame {
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public curve2SWF_2000()
{
super("ikinci dereceden eğri çizimi");
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
setBackground(Color.lightGray);
setForeground(siyah);
Dimension boyut=getSize();
int dx=boyut.width;
int dy=boyut.height;
g2.setPaint(siyah);
g2.draw3DRect(0,0,dx-3,dy-3,true);
g2.draw3DRect(3,3,dx-7,dy-7,false);
g2.setPaint(siyah);
QuadCurve2D qc2=new QuadCurve2D.Double(0,125,140,225,225,150);
g2.draw(qc2);
QuadCurve2D qc2_1=new QuadCurve2D.Double(0,200,155,225,225,170);
g2.setPaint(Color.blue);
g2.fill(qc2_1);
}
//=====================================================
public static void main(String[] args)
{
curve2SWF_2000 pencere= new curve2SWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
06032.JPG
Şekil 6.32 ikinci dereceden genel eğri çizimi, curve2SWF_2000, JFrame çıktısında görünümü
Şimdide üçüncü dereceden eğri uyduran bir program koduna göz atalım :
Program 6.30 : curve3SWF_2000.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class curve3SWF_2000 extends JFrame {
final static Color kirmizi=Color.red;
final static Color beyaz=Color.white;
final static Color siyah=Color.black;
public curve3SWF_2000()
{
super("üçüncü dereceden eğri çizimi");
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
setBackground(Color.lightGray);
setForeground(siyah);
Dimension boyut=getSize();
int dx=boyut.width;
int dy=boyut.height;
g2.setPaint(siyah);
g2.draw3DRect(0,0,dx-3,dy-3,true);
g2.draw3DRect(3,3,dx-7,dy-7,false);
g2.setPaint(siyah);
CubicCurve2D cc3=new CubicCurve2D.Double(50,175,140,90,10,90,100,175);
g2.draw(cc3);
CubicCurve2D cc3_1=new CubicCurve2D.Double(50,275,140,190,10,190,100,275);
g2.setPaint(Color.blue);
g2.fill(cc3_1);
}
//=====================================================
public static void main(String[] args)
{
curve3SWF_2000 pencere= new curve3SWF_2000();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,300);
pencere.setVisible(true);
}
}
06033.JPG
Şekil 6.33 üçüncü dereceden genel eğri çizimi, curve3SWF_2000, JFrame çıktısında görünümü
Java dili sadece .gif ve .jpg standartlarındaki resimleri gösterebilir. Resim önce getImage metotuyla bir Image sınıfı nesneye yuklenir, sonra drawImage metotuyla gösterilir.
Orneğin Image resim=getImage(getDocumentBase(),”resim.gif”);
Ve resim g.drawImage(resim,1,1,this); deyimiyle çizilir. Burada ikinci ve üçüncü noktalar başlangıç x ve y koordinatlarıdır.Son olarak this resmin çizileceği appletiniçinde bulunulan sınıfın appleti olduğunu belirtmektedir.
Bir örnek problemle resim
çizimini biraz daha belirgin hale getitelim :
Program 6.31: resim.java resim aktarım programı
import java.applet.Applet;
import java.awt.*;
public class resim extends Applet
{
private Image res;
public void init()
{
res=getImage(getDocumentBase(),"ballarat.gif");
}
public void paint(Graphics g)
{
g.drawImage(res,1,1,this);
/*
// resmi orijinalinin iki katı boyunda ciziniz
int en=res.getWidth(this);
int yukseklik=res.getWidth(this);
g.drawImage(res,1,90,en*2,yukseklik*2,this);
*/
}
}
06034.JPG
Şekil 6.34 : Resmin java üzerinden aktarılması, resim.html
Java grafik çizim olasılıkları burada verilenden çok aha geniş boyutludur. Bu bölümde veremediğimiz bir çok detayı javanın parasız olarak çekebileceğiniz döküman kütüphanesinde bulabilirsiniz.
1. ciz1.java programını inceleyiniz.
Program 6.13 ciz1.java
import java.applet.Applet;
import java.awt.*;
public class ciz1 extends Applet
{
private String s ="Bunu drawString Metotuyla yazdir";
private char c[]={'c','h','a','r','s',' ','8'};
private byte b[]={'b','y','t','e',75,76,77};
public void init()
{
Color c=new Color(0,0,255);
setBackground(c);
}
public void
paint(Graphics g)
{
g.setColor(new Color(100,255,125));
g.setFont(new Font("SansSerif",Font.PLAIN,24));
g.drawString(s,100,25);
g.drawChars(c,2,3,100,50);
g.drawBytes(b,0,6,100,75);
}
}
06015.JPG
Şekil 6.15 ciz1.html appleti
2. İki boyutlu plot çizimi amacıyla bir program paketi hazırlanmıştır. Bu paket temel olarak üç java programından oluşmaktadır. Birinci program dosyadan plot bilgisini okuyan Plot.java programıdır. Çizilecek Plotla ilgili en temel bilgi Plot.txt dosyasında bulunmaktadır. Bu dosyadaki ilk satır Pot başlığını, ikinci satır x ekseni başlığını, üçüncü satır y ekseni başlığını, dördüncü satır çizilecek iki boyutlu plot sayısını (okunacak dosya sayısını), beşinci ve sonraki satırlar plot bilgisinin olduğu dosya ismi, çizgi çizim türü, ve integer RGB renk değerlerini vermektedir. Çizgi çizim türlerini bazıları
// plottype = 0 sürekli
çizgi
// plottype = 10 kullanıcı tarafından tanımlanan karakter
// plottype = 20 dikdörtgen
// plottype = 21 daire
// plottype = 22 üçgen
// plottype = 23 eşkenar dörtgen
// plottype = 24 beşgen
// plottype = 25 altıgen
eğer çizgi türü 10 olarak tanımlanmışsa kullanılacak olan karakterinde verilmesi gerekir
a.dat 10 * 0 0 255 gibi. Aşağıda örnek bir Plot.txt dosyası değeri verilmektedir.
türkçe yazı
x ekseni
y ekseni
2
a.dat 26 0 0 255
a.dat 5 0 0 255
Plot bilgi dosyasında iki kolon olarak x,y plot bilgisi verilir. Küçük bir örnek dosyası verecek olursak :
1 1
2 4
3 9
4 16
5 25
6 36
7 49
Burada bilgi dosyadan okunmaktadır. Dosya okuma yazma komutlarını daha detaylı olarak 10. bölümde inceleyeceğiz.
Program 6.14 :
Plot.java
//======================================================
// Numerical Analysis package in java
// Plot class to plot 2D data
// Dr. Turhan Coban
// =====================================================
import java.io.*;
public class Plot
{
public String label; // Plot Label
public String xlabel; // X axis Label
public String ylabel; // Y axis Label
public String filename; // file name
public double xmax,xmin,ymax,ymin; // real max,min scale
public int xabsmin,yabsmin,abswidth,absheight; // absolute max,min
scale
public int nmax; // max number of
data points
public int nline; // max number of
data sets
public double x[][]; // x data
public double y[][]; // y=f(x) data
public int n[]; // n : number of
data in each line
public int red[],green[],blue[]; // color code 0-255
public int plottype[];
public int xgridon;
public int ygridon;
// plottype = 0 continuous line
// plottype = 10 user defined character plot
// plottype = 20 rectangle
// plottype = 21 circle
// plottype = 22 triangle
// plottype = 23 diamond
// plottype = 24
pentagon
// plottype = 25 hexagon
public char ch[]; // plot character (used with plottype 10)
public int xntic; // number of tics in x axis
public int yntic; // number of tics in y axis
BufferedReader fin;
BufferedReader ffile;
File plotFile;
File lineDataFile;
public void set_plotwindow(int width,int height,double xip,double
yip,double dxp,double dyp)
{
//sets rectangular plot window
xabsmin = (int)(width*(xip+0.2));
yabsmin = (int)(height*(yip+0.2));
abswidth = (int)(width*dxp);
absheight = (int)(height*dyp);
}
public Plot(String
pl,String xl,String yl,int xnt,int ynt
,int xgo,int ygo,String ifn[],int ipt[],int ir[],int ig[]
,int ib[]) throws IOException
{
xmin=9.99e50;
xmax=-9.99e50;
ymin=9.99e50;
ymax=-9.99e50;
xntic=8;
yntic=8;
double xtemp,ytemp;
label=pl;
xlabel=xl;
ylabel=yl;
nline=ifn.length;
xntic=xnt;
yntic=ynt;
xgridon=xgo;
ygridon=ygo;
n=new int[nline];
red=new int[nline];
green=new int[nline];
blue=new int[nline];
plottype=new int[nline];
ch=new char[nline];
//read all data to determine limit values
String fn[];
fn=new String[nline];
int i,j;
for(i=0;i<nline;i++)
{
fn[i]=ifn[i];
plottype[i]=ipt[i];
if(plottype[i] == 10) ch[i]='*';
red[i]=ir[i];
green[i]=ig[i];
blue[i]=ib[i];
j=0;
n[i]=0;
//open ffile
try
{
ffile=new BufferedReader(new FileReader(fn[i]));
} catch(IOException e)
{
System.err.println("Error Opening File \n"+e.toString());
System.exit(1);
}
try
{
while(ffile!=null)
{
xtemp=Text.readDouble(ffile);
ytemp=Text.readDouble(ffile);
if(xtemp<xmin) xmin=xtemp;
if(xtempxmax) xmax=xtemp;
if(ytemp<ymin) ymin=ytemp;
if(ytempymax) ymax=ytemp;
n[i]++;
}
} catch(EOFException e_eof) { ffile.close();}
if(i==0) nmax=n[i];
else
{
if(n[i]nmax) nmax=n[i];
}
x=new double[nline][nmax];
y=new double[nline][nmax];
for(i=0;i<nline;i++)
{
//open ffile
try{
ffile=new BufferedReader(new FileReader(lineDataFile));
} catch(IOException e)
{
System.err.println("Error Opening File \n"+e.toString());
System.exit(1);
}
for(j=0;j<n[i];j++)
{
x[i][j]=Text.readDouble(ffile);
y[i][j]=Text.readDouble(ffile);
}
}
}
set_plotwindow(400,400,0.1,0.1,0.9,0.9);
}
public Plot() throws
IOException
{
//adding max-min prompts and input fields
//initial values of max and mins
// Structure of input file
// filename
// xlabel
// ylabel
// nline xntic yntic
xgridon ygridon
// datafilename plottype redcolor greencolor bluecolor
// ........
// datafilename plottype redcolor greencolor bluecolor
//
// A sample data file input :
//
// 4 10 10 1 1
// b.dat 22 0 0 0
// a.dat 21 0 255 0
// a.dat 0 0 255 0
// b.dat 0 0 0 255
//
// see above for meaning of plot types
xmin=9.99e50;
xmax=-9.99e50;
ymin=9.99e50;
ymax=-9.99e50;
xntic=8;
yntic=8;
double xtemp,ytemp;
try{
fin=new BufferedReader(new FileReader("Plot.txt"));
} catch(IOException e)
{
System.err.println("Error Opening File \n"+e.toString());
System.exit(1);
}
label=Text.readStringLine(fin);
xlabel=Text.readStringLine(fin);
ylabel=Text.readStringLine(fin);
nline=Text.readInt(fin);
xntic=Text.readInt(fin);
yntic=Text.readInt(fin);
xgridon=Text.readInt(fin);
ygridon=Text.readInt(fin);
n=new int[30];
red=new int[30];
green=new int[30];
blue=new int[30];
plottype=new int[30];
ch=new char[30];
//read all data to determine limit values
String fn[];
fn=new String[nline];
int i,j;
for(i=0;i<nline;i++)
{
fn[i]=Text.readString(fin);
plottype[i]=Text.readInt(fin);
if(plottype[i] == 10) ch[i]=Text.readChar(fin);
red[i]=Text.readInt(fin);
green[i]=Text.readInt(fin);
blue[i]=Text.readInt(fin);
j=0;
n[i]=0;
//open ffile
try{
ffile=new BufferedReader(new FileReader(fn[i]));
} catch(IOException e)
{
System.err.println("Error Opening File \n"+e.toString());
System.exit(1);
}
try{
while(ffile!=null)
{
xtemp=Text.readDouble(ffile);
ytemp=Text.readDouble(ffile);
if(xtemp<xmin) xmin=xtemp;
if(xtempxmax) xmax=xtemp;
if(ytemp<ymin) ymin=ytemp;
if(ytempymax) ymax=ytemp;
n[i]++;
}
} catch(EOFException e_eof)
{
//close ffile
try{
ffile.close();
} catch(IOException e)
{
System.err.println("Error Closing File\n"+e.toString());
System.exit(1);
}
} //End of EOFException
if(i==0) nmax=n[i];
else
{
if(n[i]nmax) nmax=n[i];
}
}
//close ffile
try{
ffile.close();
} catch(IOException e)
{
System.err.println("Error Closing File\n"+e.toString());
System.exit(1);
}
x=new double[nline][nmax];
y=new double[nline][nmax];
//re-read the data again to load it
for(i=0;i<nline;i++)
{
//open ffile
try{
ffile=new BufferedReader(new FileReader(fn[i]));
} catch(IOException e)
{
System.err.println("Error Opening File \n"+e.toString());
System.exit(1);
}
for(j=0;j<n[i];j++)
{
x[i][j]=Text.readDouble(ffile);
y[i][j]=Text.readDouble(ffile);
}
//close ffile
try{
ffile.close();
} catch(IOException e)
{
System.err.println("Error Closing File\n"+e.toString());
System.exit(1);
}
}
set_plotwindow(400,400,0.1,0.1,0.9,0.9);
//close fin
try{
fin.close();
} catch(IOException e)
{
System.err.println("Error Closing File\n"+e.toString());
System.exit(1);
}
}
}
Program 6.15 :
PlotShapes.java
//======================================================
// Numerical Analysis package in java
// PlotShapes class
// This class convert graphic draw methods to
// plot coordinates and gives additional plotting methods
// Dr. Turhan Coban
// =====================================================
import java.io.*;
import java.awt.*;
import java.applet.Applet;
public class PlotShapes
{
Graphics g;
int xabsmin,yabsmin;
int absheight,abswidth;
double xmin,xmax,ymin,ymax;
public PlotShapes(Graphics
gi,int xabsmini ,int yabsmini,
int absheighti,int abswidthi,
double xmini,double xmaxi,
double ymini,double ymaxi)
{
// xabsmin : absulute stating point x axis
// yabsmin : absolute starting point y axis
// absheight : absoulute height of plotting window
// abswidth : absolute width of plotting window
// xmin : minimum
x value (real number)
// xmax : maximum x value (real number)
// ymin : minimum y value (real number)
// ymax : maximum y value (real number)
// g : graphic object that actual drawing is done through
g=gi;
xabsmin=xabsmini;
yabsmin=yabsmini;
absheight=absheighti;
abswidth=abswidthi;
xmin=xmini;
xmax=xmaxi;
ymin=ymini;
ymax=ymaxi;
}
public void drawLine(int
plottype,double x1,double y1,double x2,double y2)
{
// draw a line from (x1,y1) to (x2,y2)
if(plottype==0) //draw a continuous line
{
g.drawLine( (int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth),
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight),
(int)(xabsmin+(x2-xmin)/(xmax-xmin)*abswidth),
(int)(yabsmin+absheight-(y2-ymin)/(ymax-ymin)*absheight));
}
} //end of drawLine
public void drawChar(char
ch,double x1,double y1)
{
// draws a single character at (x1,y1)
char ch1[]=new char[1];
ch1[0]=ch;
int h=g.getFontMetrics().getHeight();
int w=h-2;
g.drawChars(ch1,0,1,
(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth)-2,
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight)+h/2);
} //end of PlotShapes.drawChar
public void drawChars(char
ch[],int firstspace,int numberofchars,
double x1,double y1)
{
// draws a character array from space firstspace to (firstspace+numberofchars)
// starting at (x1,y1)
int h=g.getFontMetrics().getHeight();
int w=h-2;
g.drawChars(ch,firstspace,numberofchars,
(int)((xabsmin+(x1-xmin)/(xmax-xmin)*abswidth)+5),
(int)((yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight)+h/2));
} //end of PlotShapes.drawChars
public void drawString(String
s,double x1,double y1)
{
//draws a String at (x1,y1)
int h=g.getFontMetrics().getHeight();
int w=h-2;
g.drawString(s,
(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth),
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight));
} //end of PlotShapes.drawStrings
public void drawRect(double
x1,double y1,int rectwidth,int rectheight)
{
// draw a rectangle starting at (x1,y1)
// with dimensions of (rectwidth,rectheight)
g.drawRect(
(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth-rectwidth/2),
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight-rectheight/2),
rectwidth,rectheight);
}//end of drawRect
public void drawOval(double
x1,double y1,int width,int height)
{
// draw an oval with the centre of (x1,y1)
// with dimension of (width,height)
g.drawOval(
(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth-width/2),
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight-height/2),
width,height);
}//end of drawRect
public void drawPolygon(double
x1,double y1,int radius,int side)
{
//draw a polygon of n sides n=3(trinagle),n=4(dimond)....
double Pi=4.0*Math.atan(1.0);
int xvalues[]=new int[side+1];
int yvalues[]=new int[side+1];
double angle_increase;
double angle;
angle_increase=2.0*Pi/side;
angle=Pi/2.0;
for(int i=0;i<side;i++)
{
xvalues[i]= (int)(Math.floor(xabsmin+(x1-xmin)/
(xmax-xmin)*abswidth+radius*Math.cos(angle)));
yvalues[i]= (int)(Math.floor(yabsmin+absheight-(y1-ymin)/
(ymax-ymin)*absheight-radius*Math.sin(angle)));
if(i==0) {xvalues[side]=xvalues[i];yvalues[side]=yvalues[i];}
angle+=angle_increase;
}
g.drawPolygon(xvalues,yvalues,side+1);
}//end of drawPolygon
public void drawXTic(int
ticNumber,double ticHeight,int ticSide)
{
//draw a series of x axis tics
double dtic=(xmax-xmin)/ticNumber;
double x1=xmin;
double y1=ymin;
if(ticSide==0)
{
for(int i=0;i<=ticNumber;i++)
{
drawLine(0,x1,y1,x1,(y1-ticHeight));
x1=x1+dtic;
}
}
else
{
for(int i=0;i<=ticNumber;i++)
{
drawLine(0,x1,y1,x1,(y1+ticHeight));
x1=x1+dtic;
}
}
}
public void drawYTic(int
ticNumber,double ticWidth,int ticSide)
{
//draw a series of y axis tics
double dtic=(ymax-ymin)/ticNumber;
double x1=xmin;
double y1=ymin;
if(ticSide==0)
{
for(int i=0;i<=ticNumber;i++)
{
drawLine(0,x1,y1,(x1-ticWidth),y1);
y1=y1+dtic;
}
}
else
{
for(int i=0;i<=ticNumber;i++)
{
drawLine(0,x1,y1,(x1+ticWidth),y1);
y1=y1+dtic;
}
}
}
public void drawXGrid(int
ticNumber)
{
//draw x gridlies
double dtic=(xmax-xmin)/ticNumber;
double x1=xmin;
for(int i=0;i<=ticNumber;i++)
{
drawLine(0,x1,ymin,x1,ymax);
x1=x1+dtic;
}
}
public void drawYGrid(int
ticNumber)
{
//draw y gridlines =====
double dtic=(ymax-ymin)/ticNumber;
double y1=ymin;
for(int i=0;i<=ticNumber;i++)
{
drawLine(0,xmin,y1,xmax,y1);
y1=y1+dtic;
}
}
public void drawXNumbers(int
ticNumber)
{
//draw x numbers
double dtic=(xmax-xmin)/ticNumber;
double x1=xmin;
double y1=ymin;
String s;
s=" ";
for(int i=0;i<=ticNumber;i++)
{
s=Double.toString(Math.floor(x1*100.0)/100.00);
g.drawString(s,(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth),
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight)+20);
x1=x1+dtic;
}
}
public void drawYNumbers(int
ticNumber)
{
// draw y numbers
double dtic=(ymax-ymin)/ticNumber;
double x1=xmin;
double y1=ymin;
String s;
s=" ";
for(int i=0;i<=ticNumber;i++)
{
s=Double.toString(Math.floor(y1*100)/100.0)+" ";
g.drawString(s,(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth-40),
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight));
y1=y1+dtic;
}
}
public void drawXLabel(String
xLabel)
{
// draw x labels
double x1=xmin+(xmax-xmin)/2.0;
double y1=ymin;
g.drawString(xLabel,(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth),
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight)+30);
}
public void drawYLabel(String
yLabel)
{
// draw y labels
double x1=xmin-(xmax-xmin)/6.0;
double y1=ymax-(ymax-ymin)/3.0;
int n=yLabel.length();
char ch[]=new char[n];
yLabel.getChars(0,n,ch,0);
// g.DrawString(yLabel,(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth-60),
// (int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight));
for(int i=0;i<n;i++)
{
drawChar(ch[i],x1,y1);
y1=y1-(ymax-ymin)/30;
}
}
public void drawLabel(String
Label)
{
//draw graphic label
double x1=xmin+(xmax-xmin)/2.0;
double y1=ymax;
g.drawString(Label,(int)(xabsmin+(x1-xmin)/(xmax-xmin)*abswidth),
(int)(yabsmin+absheight-(y1-ymin)/(ymax-ymin)*absheight)-10);
}
public void
drawPlotLines(int i,int plottype[],double x[][],double y[][],int n[],char
ch[])
{
int j;
//draw lines
if(plottype[i]==0)
{
for(j=0;j<n[i]-1;j++)
{
if((x[i][j]=xmin && x[i][j]<=xmax )
&& (y[i][j]=ymin && y[i][j]<=ymax))
{
if((x[i][j+1]=xmin && x[i][j+1]<=xmax) &&
(y[i][j+1]=ymin && y[i][j+1]<=ymax))
{
drawLine(0,x[i][j],y[i][j],x[i][j+1],y[i][j+1]);
}
else if(x[i][j+1]xmax)
{
double b=(y[i][j+1]-y[i][j])/(x[i][j+1]-x[i][j]);
double a=y[i][j]-b*x[i][j];
drawLine(0,x[i][j],y[i][j],xmax,(a+b*xmax));
}
else if(y[i][j+1]ymax)
{
double b=(y[i][j+1]-y[i][j])/(x[i][j+1]-x[i][j]);
double a=y[i][j]-b*x[i][j];
drawLine(0,x[i][j],y[i][j],(ymax-a)/b,ymax);
}
else if(x[i][j+1]xmax && y[i][j+1]ymax)
{
double b=(y[i][j+1]-y[i][j])/(x[i][j+1]-x[i][j]);
double a=y[i][j]-b*x[i][j];
drawLine(0,x[i][j],y[i][j],(ymax-a)/b,(a+b*xmax));
}
}
else if((x[i][j+1]=xmin && x[i][j+1]<=xmax )
&& (y[i][j+1]=ymin && y[i][j+1]<=ymax))
{
if(x[i][j]<xmin)
{
double b=(y[i][j+1]-y[i][j])/(x[i][j+1]-x[i][j]);
double a=y[i][j+1]-b*x[i][j+1];
drawLine(0,xmin,(a+b*xmin),x[i][j+1],y[i][j+1]);
}
if(y[i][j]<ymin)
{
double b=(y[i][j+1]-y[i][j])/(x[i][j+1]-x[i][j]);
double a=y[i][j+1]-b*x[i][j+1];
drawLine(0,(ymin-a)/b,ymin,x[i][j+1],y[i][j+1]);
}
}
}//end of for(j=0
}//end of if(plottype
//draw characters
else if(plottype[i]==10)
{
for(j=0;j<n[i];j++)
{
if((x[i][j]=xmin && x[i][j]<=xmax )
&& (y[i][j]=ymin && y[i][j]<=ymax))
{ drawChar(ch[i],x[i][j],y[i][j]); }
}//end of for(j=0;
}//end else if(plottype[i]==10)
//draw rectangles
else if(plottype[i]==20)
{
for(j=0;j<n[i];j++)
{
if((x[i][j]=xmin && x[i][j]<=xmax )
&& (y[i][j]=ymin && y[i][j]<=ymax))
{ drawRect(x[i][j],y[i][j],4,4); }
}//end of for(j=0;
}//end else if(plottype[i]==20)
//draw circle
else if(plottype[i]==21)
{
for(j=0;j<n[i];j++)
{
if((x[i][j]=xmin && x[i][j]<=xmax )
&& (y[i][j]=ymin && y[i][j]<=ymax))
{ drawOval(x[i][j],y[i][j],4,4); }
}//end of for(j=0;
}//end else if(plottype[i]==21)
else if(plottype[i]=22 && plottype[i]<=27)
{
for(j=0;j<n[i];j++)
{ if((x[i][j]=xmin && x[i][j]<=xmax )
&& (y[i][j]=ymin && y[i][j]<=ymax))
{drawPolygon(x[i][j],y[i][j],5,(plottype[i]-19));}
}//end of for(j=0;
}//end else if(plottype[i]==21..27)
}
}
Program 6.16 :
PlotApplet.java
//======================================================
// Numerical Analysis package in java
// PlotApplet class to plot 2D data
// Dr. Turhan Coban
// =====================================================
import java.io.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import PlotShapes;
import Plot;
public class
PlotApplet extends Applet implements ActionListener
{
Label promptXmin; // Label prompt in Xmin field
Label promptXmax; // Label prompt in Xmax field
Label promptYmin; // Label prompt in Ymin field
Label promptYmax; // Label prompt in Ymax field
TextField inputXmin; // input field Xmin
TextField inputXmax; // input field Xmax
TextField inputYmin; // input field Ymin
TextField inputYmax; // input field Ymax
Plot p1;
public void init()
{
//adding max-min prompts and input fields
//label
//xaxis
//yaxis
// 4 10 10 1 1
// b.dat 22 0 0 0
// a.dat 21 0 255 0
// a.dat 0 0 255 0
// b.dat 0 0 0 255
int xnt=10;
int ynt=10;
int xgo=1;
int ygo=1;
String il=new String("label");
String xl=new String("x axis");
String yl=new String("y axis");
String ifn[]=new String[4];
ifn[0]="b.dat";
ifn[1]="a.dat";
ifn[2]="a.dat";
ifn[3]="b.dat";
int ipt[]=new int[4];
int ib[]=new int[4];
int ir[]=new int[4];
int ig[]=new int[4];
ipt[0]=22;
ipt[1]=21;
ipt[2]=0;
ipt[3]=0;
ir[0]=0;
ig[0]=0;
ib[0]=0;
ir[1]=0;
ig[1]=255;
ib[1]=0;
ir[2]=0;
ig[2]=255;
ib[2]=0;
ir[3]=0;
ig[3]=255;
ib[3]=0;
try{
//p1=new Plot(il,xl,yl,xnt,ynt,xgo,ygo,ifn,ipt,ir,ig,ib);
p1=new Plot();
} catch(IOException ioe) {System.err.println("IOException in
opening Plot");}
promptXmin=new Label("Xmin ");
inputXmin=new TextField(5);
promptXmax=new Label("Xmax ");
inputXmax=new TextField(5);
promptYmin=new Label("Ymin ");
inputYmin=new TextField(5);
promptYmax=new Label("Ymax ");
inputYmax=new TextField(5);
inputXmin.addActionListener(this);
inputXmax.addActionListener(this);
inputYmin.addActionListener(this);
inputYmax.addActionListener(this);
add(promptXmin);
add(inputXmin);
add(promptXmax);
add(inputXmax);
add(promptYmin);
add(inputYmin);
add(promptYmax);
add(inputYmax);
}
public void
paint(Graphics g)
{
inputXmin.setText(Double.toString(p1.xmin));
inputXmax.setText(Double.toString(p1.xmax));
inputYmin.setText(Double.toString(p1.ymin));
inputYmax.setText(Double.toString(p1.ymax));
PlotShapes ps=new PlotShapes(g,p1.xabsmin,p1.yabsmin,
p1.absheight,p1.abswidth,p1.xmin,p1.xmax,p1.ymin,p1.ymax);
g.drawRect(p1.xabsmin,p1.yabsmin,p1.abswidth,p1.absheight);
ps.drawXTic(p1.xntic,(p1.ymax-p1.ymin)/80.0,0);
ps.drawYTic(p1.yntic,(p1.xmax-p1.xmin)/80.0,0);
ps.drawXNumbers(p1.xntic);
ps.drawYNumbers(p1.xntic);
ps.drawLabel(p1.label);
ps.drawXLabel(p1.xlabel);
ps.drawYLabel(p1.ylabel);
if(p1.xgridon!=0)
ps.drawXGrid(p1.xntic);
if(p1.ygridon!=0)
ps.drawYGrid(p1.yntic);
int i,j;
for(i=0;i<p1.nline;i++)
{
// Select plot colors
g.setColor(new Color(p1.red[i],p1.green[i],p1.blue[i]));
ps.drawPlotLines(i,p1.plottype,p1.x,p1.y,p1.n,p1.ch);
}//end of for(i=0
}//end of method
public void
actionPerformed( ActionEvent e)
{
Double valXmin=new Double(inputXmin.getText());
p1.xmin=valXmin.doubleValue();
Double valXmax=new Double(inputXmax.getText());
p1.xmax=valXmax.doubleValue();
Double valYmin=new Double(inputYmin.getText());
p1.ymin=valYmin.doubleValue();
Double valYmax=new Double(inputYmax.getText());
p1.ymax=valYmax.doubleValue();
repaint();
}
}
06016.JPG
Şekil 6.16 : PlotApplet.html çıktısı
3. drawRect ve fillRect metotlarını kullanarak biri dolu diğeri sadece bir çizgi olan iki dikdörtgen çiz.
1. Oval ve fillOval metotlarını kullanarak biri dolu diğeri sadece bir çizgi olan iki daire çiz.
2. Paint2D metodlarından yararlanarak biri dolu diğeri sadece bir çizgi olan iki eşkenar dörtgen çizdir.
3. resim.java sınıfında çizilen resmi iki kat büyüklüğnde çizdir.
Program 6.17 resim1.java
import java.applet.Applet;
import java.awt.*;
public class resim1 extends
Applet
{
private Image bebek;
public void init()
{
bebek=getImage(getDocumentBase(),"turhan.gif");
}
public void paint(Graphics
g)
{
g.drawImage(bebek,1,1,this);
}
}
4. drawPolygon ve fillPolygon metotlarını kullanarak biri dolu diğeri sadece bir çizgi olan iki eşkenar üçgen çiz.
5.
Türkçe renkleri
tanımlıyan renk sınıfını yaz (
renk.java).
Program 6.18 . renk.java, türkçe renk tanımı sınıfı
import java.io.*;
import java.awt.*;
import java.applet.Applet;
public class renk extends
Color
{
public final static renk kirmizi=new renk(255,0,0);
public final static renk mavi=new renk(0,0,255);
public final static renk siyah=new renk(0,0,0);
public final static renk camgobegi=new renk(0,255,255);
public final static renk koyugri=new renk(64,64,64);
public final static renk gri=new renk(128,138,128);
public final static renk yesil=new renk(0,255,0);
public final static renk acikgri=new renk(192,192,192);
public final static renk mor=new renk(255,0,255);
public final static renk portakal=new renk(255,200,0);
public final static renk pembe=new renk(255,175,175);
public final static renk beyaz=new renk(255,255,255);
public final static renk sari=new renk(255,255,0);
public final static renk acikmavi=new renk(150,206,237);
public final static renk lacivert=new renk(0,0,128);
//burada kendi yeni renginizi tanımlayabilirsiniz.
public renk(float
kirmizi,float yesil, float mavi)
{
super(kirmizi,yesil,mavi);
}
public renk(double
kirmizi,double yesil, double mavi)
{
super((float)kirmizi,(float)yesil,(float)mavi);
}
public renk(int kirmizi,int
yesil, int mavi)
{
super(kirmizi,yesil,mavi);
}
public renk(int RGB)
{
super(RGB);
}
public renk(renk r)
{
super(r.getKirmizi(),r.getYesil(),r.getMavi());
}
public int getKirmizi()
{
return getRed();
}
public int getYesil()
{
return getGreen();
}
public int getMavi()
{
return getBlue();
}
public int getKYM()
{
return getRGB();
}
public String toString()
{
return "renk[ kirmizi "+getKirmizi()+" mavi "+getMavi()+" yesil "+getYesil()+"]";
}
//metotlar
//static int HSBtoRGB(float hue,float saturation,float brightness)
//getRed(),getGreen(),getBlue(),getRGB()
}
6. Problem 5.10 da verilen Polar.java, yildiz.java ve yildizCiz.java programlarını inceleyiniz.
Problem 6.19 : Yildiz.java
import java.io.*;
import java.awt.*;
import java.applet.Applet;
import polar;
public class yildiz
{
public static void drawYildiz1(Graphics g,int xi,int yi, int n,int yildizboyu,double aci )
{
// bu yıldız cizime teta=pi/2+aci radyandan baslar
double teta=2.0*Math.PI/n;
double R=yildizboyu;
double r=yildizboyu*0.25;
polar P1=new polar();
polar P2=new polar();
polar P3=new polar();
for(int i=0;i<n;i++)
{
double teta1=teta*i+Math.PI/2.0+aci;
double teta2=teta/2+teta1;
P1.polarGir(R,teta1);
P2.polarGir(r,teta2);
g.drawLine((xi+(int)P1.xi()),(yi-(int)P1.xj()),
(xi+(int)P2.xi()),(yi-(int)P2.xj()));
double teta3=teta*(i+1)+Math.PI/2.0+aci;
P3.polarGir(R,teta3);
g.drawLine((xi+(int)P2.xi()),(yi-(int)P2.xj()),
(xi+(int)P3.xi()),(yi-(int)P3.xj()));
g.drawLine(xi,yi,
(xi+(int)P1.xi()),(yi-(int)P1.xj()));
g.drawLine(xi,yi,
(xi+(int)P2.xi()),(yi-(int)P2.xj()));
}
} //drawYildiz1 metodu sonu
public static void drawYildiz1(Graphics g,int xi,int yi, int n,int yildizboyu )
{
drawYildiz1(g,xi,yi,n,yildizboyu,0);
} //drawYildiz1 metodu sonu
public static void drawYildiz(Graphics g,int xi,int yi, int n,int yildizboyu,double aci )
{
// bu y�ld�z cizime teta=pi/2+aci radyandan baslar
double teta=2.0*Math.PI/n;
double R=yildizboyu;
double r=yildizboyu*0.25;
polar P1=new polar();
polar P2=new polar();
polar P3=new polar();
int x[]=new int[2*n+2];
int y[]=new int[2*n+2];
for(int i=0;i<=n;i++)
{
double teta1=teta*i+Math.PI/2.0+aci;
double teta2=teta/2.0+teta1;
P1.polarGir(R,teta1);
P2.polarGir(r,teta2);
x[2*i]=xi+(int)P1.xi();
y[2*i]=yi-(int)P1.xj();
x[2*i+1]=xi+(int)P2.xi();
y[2*i+1]=yi-(int)P2.xj();
if(i==n)
{
x[2*i]=x[0];
y[2*i]=y[0];
}
}
g.drawPolygon(x,y,(2*n+2));
} //drawYildiz1 metodu sonu
public static void fillYildiz(Graphics g,int xi,int yi, int n,int yildizboyu,double aci )
{
// bu y�ld�z cizime teta=pi/2+aci radyandan baslar
// yild�zin i‡ini boyar
double teta=2.0*Math.PI/n;
double R=yildizboyu;
double r=yildizboyu*0.25;
polar P1=new polar();
polar P2=new polar();
polar P3=new polar();
int x[]=new int[2*n+2];
int y[]=new int[2*n+2];
for(int i=0;i<=n;i++)
{
double teta1=teta*i+Math.PI/2.0+aci;
double teta2=teta/2.0+teta1;
P1.polarGir(R,teta1);
P2.polarGir(r,teta2);
x[2*i]=xi+(int)P1.xi();
y[2*i]=yi-(int)P1.xj();
x[2*i+1]=xi+(int)P2.xi();
y[2*i+1]=yi-(int)P2.xj();
if(i==n)
{
x[2*i]=x[0];
y[2*i]=y[0];
}
}
g.fillPolygon(x,y,(2*n+2));
} //fillYildiz metodu sonu
public static void fillYildiz1(Graphics g,int xi,int yi, int n,int yildizboyu,double aci )
{
// bu y�ld�z cizime teta=pi/2+aci radyandan baslar
// yild�zin i‡ini boyar
double teta=2.0*Math.PI/n;
double R=yildizboyu;
double r=yildizboyu*0.25;
polar P1=new polar();
polar P2=new polar();
polar P3=new polar();
int x[]=new int[2*n+2];
int y[]=new int[2*n+2];
for(int i=0;i<=n;i++)
{
double teta1=teta*i+Math.PI/2.0+aci;
double teta2=teta/2.0+teta1;
P1.polarGir(R,teta1);
P2.polarGir(r,teta2);
x[2*i]=xi+(int)P1.xi();
y[2*i]=yi-(int)P1.xj();
x[2*i+1]=xi+(int)P2.xi();
y[2*i+1]=yi-(int)P2.xj();
if(i==n)
{
x[2*i]=x[0];
y[2*i]=y[0];
}
}
g.fillPolygon(x,y,(2*n+2));
} //fillYildiz metodu sonu
}
Program 6.20 : YıldızCiz.java
import java.applet.Applet;
import java.awt.*;
import yildiz;
import renk;
public class yildizCiz extends Applet
{
public void paint(Graphics g)
{
//g.setColor(Color.yellow);
g.setColor(renk.sari);
setBackground(renk.mavi);
yildiz.fillYildiz(g,100,100,3,100,0);
g.setColor(renk.siyah);
yildiz.drawYildiz1(g,100,100,3,100,0);
}
}
10. yildizCiz1.java programını inceleyiniz.
Program 6.21 YildizCiz1.java
import java.applet.Applet;
import java.awt.*;
import yildiz;
public class yildizCiz1 extends Applet
{
public void paint(Graphics g)
{
double aci=0;
for(long j=0;j<5000;j++)
{
g.setColor(Color.black);
yildiz.drawYildiz(g,100,100,3,100,aci);
for(long i=0;i<10000;i++) {};
g.setColor(Color.white);
yildiz.drawYildiz(g,100,100,3,100,aci);
aci+=.001;
}
g.setColor(Color.black);
yildiz.drawYildiz(g,100,100,3,100,0);
}
}
7. Program 6.18 de verilen renk sınıfını test eden renkTest.java programını inceleyiniz. Ve applet çıktısını çalıştırınız.
Program 6.21 renkTest.java
import java.awt.*;
import java.applet.Applet;
import renk;
public class RenkTest extends Applet
{
private int kirmizi,yesil,mavi;
public void init()
{
kirmizi=150;
yesil=255;
mavi=125;
// arka palan�n rengi mavi olarak veriliyor
setBackground(renk.mavi);
}
public void paint(Graphics g)
{
// yazının rengi 100,255,125 olarak alındı
g.setColor(new renk(kirmizi,yesil,mavi));
g.drawString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",50,33);
showStatus("Su andaki arkaplan rengi : "+getBackground());
}
06017
Şekil 6.17 RenkTest.html appletinin görünümü
11.
H6O2
polar.java, yildiz.java, yildizCiz.java programlarinin inceleyiniz. aynı programlama prensiplerini kullanarak n eşkenar kenarlı çokken çizecek eskenarcokgen.java sınıfını yaratınız. Bu sinif
public static void
drawEskenarCokgen(Graphics g,int xi,int yi, int n,int esgenarcokkencapi,double
aci )
public static void fillEskenarCokgen(Graphics g,int xi,int yi, int
n,int yildizboyu,double aci )
metotlarini kullanarak eskenar cokgen çizsin ve icini boyasin.
not xi,yi : çokken merkezinin
koordinatları
n : çokken köşe sayısı
eskenarcokkencapi: çokken merkezinden cokken köşesine olan mesafe
aci : 90 derece açı çokkenin başlama açısı olarak tanımlanmıştır. bu
açıdan sapış radyan olarak.
Program 6.22 eskenarcokgen.java
import java.io.*;
import java.awt.*;
import java.applet.Applet;
import polar;
public class eskenarcokgen
{
public static void drawEskenarcokgen(Graphics g,int xi,int yi, int n,int eskenarcokgenboyu,double aci )
{
// xi,yi eskenar cokgen merkez koordinatlari
// n : eskenar dortgen kose sayisi
// eskenarcokkenboyu : eskenar cokgen merkezinden
// kenarina olan mesafe
// bu eskenarcokken cizime teta=pi/2+aci radyandan baslar
double teta=2.0*Math.PI/n;
double R=eskenarcokgenboyu;
polar P1=new polar();
int x[]=new int[2*n+2];
int y[]=new int[2*n+2];
for(int i=0;i<=n;i++)
{
double teta1=teta*i+Math.PI/2.0+aci;
P1.polarGir(R,teta1);
x[i]=xi+(int)P1.xi();
y[i]=yi-(int)P1.xj();
if(i==n)
{
x[i]=x[0];
y[i]=y[0];
}
}
g.drawPolygon(x,y,(n+1));
} //draweskenarcokgen metotu sonu
public static void fillEskenarcokgen(Graphics g,int xi,int yi, int n,int eskenarcokgenboyu,double aci )
{
// bu eskenarcokgen cizime teta=pi/2+aci radyandan baslar
double teta=2.0*Math.PI/n;
double R=eskenarcokgenboyu;
polar P1=new polar();
int x[]=new int[2*n+2];
int y[]=new int[2*n+2];
for(int i=0;i<=n;i++)
{
double teta1=teta*i+Math.PI/2.0+aci;
P1.polarGir(R,teta1);
x[i]=xi+(int)P1.xi();
y[i]=yi-(int)P1.xj();
if(i==n)
{
x[i]=x[0];
y[i]=y[0];
}
}
g.fillPolygon(x,y,(n+1));
} //filleskenarcokgen metotu sonu
}
8. eskenarcokgen sınıfını test etmek amacıyla bir applet programı yazınız ve ekrana beşken çizdiriniz.
9. eskenarcokgen sınıfını test etmek amacıyla bir JFrame programı yazınız ve ekrana üçken çizdiriniz.
13.
H6O3
grafik sınıfındaki:
public abstract void drawRect(int x1,int y1, int en,int yükseklik)
metotundan yararlanarak H6O3 sinifinda
public static void drawAciliDortgen(Graphics g, int x1,int y1, int en,int yükseklik,double aci)
metotunu yaziniz. Bu metot dikdortgeni verilen açi kadar bir açıyla cizdirsin.
x1,y1 : dörtgenin
sağ üst köşe koordinatları
en,yükseklik : dörtgenin eni ve yüksekliği
aci: dörgenin radyan cinsinden x1,y1 noktası etrafında dönme miktarı.
not :polar sınıfı ve drawPolygon metotlarından yararlanabilirsiniz.
Program 6.23 açılı dikdortgen çizdiren dikdortgen sınıfı
İmport java.io.*;
import java.awt.*;
import java.applet.Applet;
import polar;
public class dikdortgen
{
public static void drawdikdortgen(Graphics g,int xi,int yi,int en,int boy,double aci )
{
double R=boy;
double r=en;
polar P1=new polar();
polar P2=new polar();
polar P3=new polar();
polar P4=new polar();
int x[]=new int[5];
int y[]=new int[5];
int k=0;
//P1.polarGir(R,teta1);
x[0]=xi;
y[0]=yi;
double teta1=aci;
P2.polarGir(r,teta1);
x[1]=x[0]+(int)P2.xi();
y[1]=y[0]-(int)P2.xj();
teta1+=Math.PI/2;
P3.polarGir(R,teta1);
x[2]=x[1]+(int)P3.xi();
y[2]=y[1]-(int)P3.xj();
teta1+=Math.PI/2;
P4.polarGir(r,teta1);
x[3]=x[2]+(int)P4.xi();
y[3]=y[2]-(int)P4.xj();
x[4]=xi;
y[4]=yi;
g.drawPolygon(x,y,4);
}
public static void filldikdortgen(Graphics g,int xi,int yi,int en,int boy,double aci )
{
double R=boy;
double r=en;
polar P1=new polar();
polar P2=new polar();
polar P3=new polar();
polar P4=new polar();
int x[]=new int[5];
int y[]=new int[5];
int k=0;
x[0]=xi;
y[0]=yi;
double teta1=aci;
P2.polarGir(r,teta1);
x[1]=x[0]+(int)P2.xi();
y[1]=y[0]-(int)P2.xj();
teta1+=Math.PI/2;
P3.polarGir(R,teta1);
x[2]=x[1]+(int)P3.xi();
y[2]=y[1]-(int)P3.xj();
teta1+=Math.PI/2;
P4.polarGir(r,teta1);
x[3]=x[2]+(int)P4.xi();
y[3]=y[2]-(int)P4.xj();
x[4]=xi;
y[4]=yi;
g.fillPolygon(x,y,4);
}
}
Program 6.24 : dikdortgen sınıfını kullanan H6O2.java programı
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import dikdortgen;
import renk;
public class H6O2 extends Applet implements ActionListener
{
int en,boy,xi1,yi1,yaricap1;
double aci1;
renk renk; //sinifin adi renk, nesne adi renk
Label kutu1;
Label kutu2;
Label kutu3;
Label kutu4;
Label kutu5;
Label bos1;
Label bos2;
Label bos3;
Label renk1;
Label kirmizi;
Label mavi;
Label yesil;
TextField kutugir1;
TextField kutugir2;
TextField kutugir3;
TextField kutugir4;
TextField kutugir5;
TextField kutukirmizi;
TextField kutumavi;
TextField kutuyesil;
public void init(){
//not : init metotunda t�m de§iŸkenlerin ilk de§erleri verilmelidir.
Panel p=new Panel();
p.setLayout(new GridLayout(5,4));
//5*4 tablo p paneli haz�rland�
kutu1=new Label("xi noktasini giriniz :");
p.add(kutu1);
kutugir1=new TextField(3);
p.add(kutugir1);
kutu2=new Label("yi noktasini giriniz :");
p.add(kutu2);
kutugir2=new TextField(3);
p.add(kutugir2);
kutu3=new Label("eni giriniz :");
p.add(kutu3);
kutugir3=new TextField(3);
p.add(kutugir3);
kutu4=new Label("yuksekligi giriniz :");
p.add(kutu4);
kutugir4=new TextField(3);
p.add(kutugir4);
kutu5=new Label("aciyi giriniz (derece) :");
p.add(kutu5);
kutugir5=new TextField(3);
p.add(kutugir5);
bos1=new Label(" ");
bos2=new Label(" ");
bos3=new Label(" ");
renk1=new Label("renk");
kirmizi=new Label("kirmizi");
mavi=new Label("mavi");
yesil=new Label("yesil");
kutukirmizi=new TextField(4);
kutumavi=new TextField(4);
kutuyesil=new TextField(4);
xi1=300;
yi1=300;
en=150;
boy=100;
yaricap1=(int)Math.sqrt(100*100+150*150);
aci1=0;
kutugir1.setText(""+xi1);
kutugir2.setText(""+yi1);
kutugir3.setText(""+en);
kutugir4.setText(""+boy);
kutugir5.setText(""+aci1);
kutukirmizi.setText("255");
kutumavi.setText("200");
kutuyesil.setText("0");
renk=new renk(255,200,0);
p.add(bos1);
p.add(bos2);
p.add(bos3);
p.add(kirmizi);
p.add(yesil);
p.add(mavi);
p.add(renk1);
p.add(kutukirmizi);
p.add(kutumavi);
p.add(kutuyesil);
//elemanlar p paneline p paneli de aplete eklendi
add(p,BorderLayout.NORTH);
kutukirmizi.addActionListener(this);
kutumavi.addActionListener(this);
kutuyesil.addActionListener(this);
kutugir1.addActionListener(this);
kutugir2.addActionListener(this);
kutugir3.addActionListener(this);
kutugir4.addActionListener(this);
kutugir5.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
Integer xi1i=new Integer(kutugir1.getText());
xi1=xi1i.intValue();
Integer yi1i=new Integer(kutugir2.getText());
yi1=yi1i.intValue();
Integer eni=new Integer(kutugir3.getText());
en=eni.intValue();
Integer boyi=new Integer(kutugir4.getText());
boy=boyi.intValue();
Double aci1i=new Double(kutugir5.getText());
aci1=aci1i.doubleValue();
Integer Kirmizii=new Integer(kutukirmizi.getText());
int kirmizi1=Kirmizii.intValue();
Integer Mavii=new Integer(kutumavi.getText());
int mavi1=Mavii.intValue();
Integer Yesili=new Integer(kutuyesil.getText());
int yesil1=Yesili.intValue();
renk=new renk(kirmizi1,mavi1,yesil1);
repaint();
}
public void paint(Graphics g)
{
g.setColor(renk);
dikdortgen.filldikdortgen(g,xi1,yi1,en,boy,(aci1/180.0*Math.PI));
g.setColor(renk.siyah);
dikdortgen.drawdikdortgen(g,xi1,yi1,en,boy,(aci1/180.0*Math.PI));
}
}
<< index
< bölüm 5
> bölüm 7
bölüm başı