2017-03-09 9 views
0

私は陰陽記号をJavaで翻訳、回転、スケーリングするのに助けが必要です。誰も私が下のコードを投稿する提案を提供することができます。私はアフィン変換を使用しようとしています誰も、私は回転、翻訳、スケールを移動することを決定したときにすべての部分がスーツに従うことを確認する方法がありますか?翻訳、スケール、回転陰陽記号

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Area; 
import java.awt.geom.Ellipse2D; 
import javax.swing.JFrame; 


public class ScaleTranslationRotation extends JFrame 
{ 

public void paint(Graphics g){ 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 

     int xLeft,yUpper,width, height; 
     xLeft = this.getInsets().left; 
     yUpper = this.getInsets().top; 
     width = this.getWidth()-xLeft-this.getInsets().right; 
     height = this.getHeight()-this.getInsets().top-this.getInsets().bottom; 




     int xCenter = getWidth()/2; 
     int yCenter = getHeight()/2; 
     int radius = (int)(Math.min(getWidth(), getHeight()) * 0.2); 
     int x = xCenter - radius; 
     int y = yCenter - radius; 

     AffineTransform yUp = new AffineTransform(); 

     g.setColor(Color.blue); 
     g.fillOval(x, y, 2 * radius, 2 * radius); 
     g.setColor(Color.cyan); 
     g.drawOval(x, y, 2 * radius, 2 * radius); 
     g.setColor(Color.cyan); 
     g.fillArc(x, y, 2 * radius, 2 * radius, 270, 180); 
     g.setColor(Color.blue); 
     g.fillOval(x + (radius/2), y, radius, radius); 
     g.setColor(Color.cyan); 
     g.fillOval(x + (radius/2), y + radius, radius, radius); 
     g.setColor(Color.cyan); 
     g.fillOval(x + radius - (radius/4), y + radius/4, radius/2, radius/2); 
     g.setColor(Color.blue); 
     g.fillOval(x + radius - (radius/4), y + radius + radius/4, radius/2, radius/2); 


    g2d.setStroke(new BasicStroke(1.0f)); 
    g.setColor(Color.red); 
    drawSimpleCoordinateSystem(width,height, g2d); 
    grid(width, height, g2d); 
} 

public static void drawSimpleCoordinateSystem(int x, int y, Graphics2D g2d){ 

     int xOffset = 30; 
     int yOffset = 50; 
     int step = 20; 

     String s; 
     //Remember the actual font. 
     Font fo = g2d.getFont(); 
     //Use a small font. 
     g2d.setFont(new Font("sansserif",Font.PLAIN,9)); 
     //x-axis. 
     g2d.drawLine(xOffset,yOffset,x,yOffset); 
//Marks and labels for the x-axis. 
    for (int i=xOffset+step; i<=x; i=i+step) 
    { 
    g2d.drawLine(i,yOffset-2,i,yOffset+2); 
    g2d.drawString(String.valueOf(i),i-7,yOffset-7); 
    } 

//y-axis. 
     g2d.drawLine(xOffset,yOffset,xOffset,y); 

     //Marks and labels for the y-axis. 
     s=" "; //for indention of numbers < 100 
     for (int i=yOffset+step; i<=y; i=i+step){ 
     g2d.drawLine(xOffset-2,i,xOffset+2,i); 
     if (i>99){s="";} 
     g2d.drawString(s+String.valueOf(i),xOffset-25,i+5); 
} 

//Reset to the original font. 
     g2d.setFont(fo); 
} 


public void grid(int x, int y, Graphics2D g2d){ 
     int xOffset = 30; 
     int yOffset = 50; 
     int step = 20; 
     g2d.drawLine(xOffset, yOffset, x, yOffset); 
    for(int i = xOffset+step; i<= x; i = i+step){ 
     g2d.drawLine(i, yOffset, i, y); 
    } 
    g2d.drawLine(xOffset, yOffset, xOffset, y); 
    for(int i = yOffset+step; i<=y; i = i+step){ 
    g2d.drawLine(xOffset, i, x, i); 
    } 

} 


public static void main(String[] args) 
{ 
    ScaleTranslationRotation f = new ScaleTranslationRotation(); 
    f.setTitle("STR"); 
    f.setSize(1920,1020); 
    f.setVisible(true); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

答えて

0

ちょうど方法

private void drawSymbol(int x, int y, int radius, Graphics g) { 

     g.setColor(Color.blue); 
     g.fillOval(x, y, 2 * radius, 2 * radius); 
     g.setColor(Color.cyan); 
     g.drawOval(x, y, 2 * radius, 2 * radius); 
     g.setColor(Color.cyan); 
     g.fillArc(x, y, 2 * radius, 2 * radius, 270, 180); 
     g.setColor(Color.blue); 
     g.fillOval(x + (radius/2), y, radius, radius); 
     g.setColor(Color.cyan); 
     g.fillOval(x + (radius/2), y + radius, radius, radius); 
     g.setColor(Color.cyan); 
     g.fillOval(x + radius - (radius/4), y + radius/4, radius/2, radius/2); 
     g.setColor(Color.blue); 
     g.fillOval(x + radius - (radius/4), y + radius + radius/4, radius/2, radius/2); 

} 

に陰陽のシンボルコードにコードを配置し、要求された変換を実行するメソッドを呼び出す前に、アフィン変換を使用します。 以下では、シンボルを異なる変換で3回描画します。 元のアフィン変換を初期値に戻すことを忘れないでください。

drawSymbol(x,y,radius,g); 
    //save original transformation 
    AffineTransform oldt=((Graphics2D) g).getTransform(); 
    //create new transformation and apply it 
    AffineTransform yUp = new AffineTransform(); 
    yUp.translate(0,-100); 
    ((Graphics2D) g).setTransform(yUp); 
    drawSymbol(x,y,radius,g); 


    //create anothernew transformation and apply it 
    yUp = new AffineTransform(); 
    yUp.translate(-100,0); 
    ((Graphics2D) g).setTransform(yUp); 
    drawSymbol(x,y,radius,g); 

    //restore old transforamtion 
    ((Graphics2D) g).setTransform(oldt); 

    g2d.setStroke(new BasicStroke(1.0f)); 
    g.setColor(Color.red); 
    drawSimpleCoordinateSystem(width,height, g2d); 
    grid(width, height, g2d); 
関連する問題