【问题标题】:Translate, Scale, Rotate Yin Yang Symbol平移、缩放、旋转阴阳符号
【发布时间】:2018-03-08 14:08:26
【问题描述】:

我需要在 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);
  }
 }

【问题讨论】:

    标签: java swing rotation scaling translate


    【解决方案1】:

    只需将你的代码阴阳符号代码放在一个方法中

        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);
    
    }
    

    然后在调用方法执行请求的转换之前使用仿射转换。 在下面我用不同的变换画了三次符号 记得把原来的仿射变换恢复到初始值:

        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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2015-02-27
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2013-11-15
      相关资源
      最近更新 更多