-1

如何在椭圆内绘制独特的矩形(立方体):

http://i.stack.imgur.com/pmHTl.jpg

在此处输入图像描述

对我来说,使用图形来绘制一个如图所示的矩形是很棘手的。关于做什么的任何建议。

好的。我会尽量让自己清楚。到目前为止,我所拥有的是橙色椭圆形和它后面的细长灰色椭圆形。我只需要在一个类中创建这些“点”中的一个,我将制作它们的许多对象。我需要帮助的任务是使用 J 组件绘制您看到的橙色圆点中的“矩形”形状。如果此编辑不能满足您理解我的问题的需要,我将根据要求添加我到目前为止所拥有的图片。

谢谢

编辑:如果您感兴趣,这是我创建椭圆的代码-

public void paint(Graphics g)  {
    Color c = (Color.orange);
    g.setColor(Color.gray);
    g.fillOval(3,3,60,60);
    g.setColor(c);
   g.fillOval(0,0,60,60);
  } 

编辑:我在 SSCCE 上的尝试 --> NanoBot 类(我在哪里创建 Bot 油漆)

/**
 * @author (Omar Ahmed) 
 */
 import javax.swing.*;
 import java.awt.*;
 public class NanoBot extends Image
 {


public NanoBot(int x, int y, int w, int h)
{
    super(x,y,w,h);
}

public void paint(Graphics g)  {
    Color c = (Color.orange);
    g.setColor(Color.gray);
    g.fillOval(3,3,60,60);
    g.setColor(c);
    g.fillOval(0,0,60,60);
    //g.setColor(Color.black);
    //g.fillOval(10,20,10,10);
    //g.fillOval(40,20,10,10);

} 
}

和司机:

/** Bot Swarm
 *  Date: May, 2013
 *  Author: Omar Ahmed
 */
import java.awt.*;
import javax.swing.*;
public class Driver  { 
    private JFrame win;
    private NanoBot bot1;
        public Driver()   {
        win = new JFrame(" Swarm ");
        win.setLayout(null);
        win.setVisible(true);
        win.setBounds( 20, 20, 800, 700);
        win.getContentPane().setBackground(Color.white);
        bot1=new NanoBot(50,50,70,70);
        win.add(bot1,0);

}

Hope This Helps
4

1 回答 1

2

您的第一步是分解您的要求...

在此处输入图像描述

您需要绘制 3 个形状,正面、顶部、侧面。

前面的 y 位置偏移了总高度的 0.412。它的宽度是整体宽度的 0.77。

顶部的高度是整体高度的 0.412,它的水平插入是整体宽度的 0.2...

边的 x 位置偏移了总宽度的 0.77,并且插入了总宽度的 0.47。

这一切都非常重要,因为您要确保形状可以合理地调整大小......

现在,您可以简单地使用Graphics#drawLineandGraphics#drawRectangle来构建形状,但是,对我来说,这是很多工作......

相反,2D 图形非常强大,包含许多奇妙的东西,今天感兴趣的是ShapeAPI,它允许您定义许多不同的形状,可以绘制或填充。

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestChip {

    public static void main(String[] args) {
        new TestChip();
    }

    public TestChip() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();

            int width = 44;
            int height = 17;
            Front front = new Front(width, height);
            Top top = new Top(width, height);
            Side side = new Side(width, height);

            draw(g2d, front, Color.BLACK, Color.YELLOW);
            draw(g2d, top, Color.BLACK, Color.GRAY);
            draw(g2d, side, Color.BLACK, Color.DARK_GRAY);

            g2d.dispose();
        }

        protected void draw(Graphics2D g2d, Shape shape, Color foreground, Color background) {
            g2d.setColor(background);
            g2d.fill(shape);
            g2d.setColor(foreground);
            g2d.draw(shape);
        }
    }

    public class Front extends Path2D.Float {

        public Front(float width, float height) {
            float frontWidth = width * 0.77f;
            float yOffset = height * 0.412f;

            moveTo(0, yOffset);
            lineTo(frontWidth, yOffset);
            lineTo(frontWidth, height);
            lineTo(0, height);

            closePath();
        }
    }

    public class Side extends Path2D.Float {

        public Side(float width, float height) {
            float xOffset = width * 0.77f;
            float inset = height * 0.47f;
            moveTo(xOffset, inset);
            lineTo(width, 0);
            lineTo(width, inset);
            lineTo(xOffset, height);
            closePath();
        }
    }

    public class Top extends Path2D.Float {

        public Top(float width, float height) {
            float inset = width * 0.2f;
            float shapeHeight = height * 0.412f;
            moveTo(inset, 0);
            lineTo(width, 0);
            lineTo(width - inset, shapeHeight);
            lineTo(0, shapeHeight);
            closePath();
        }
    }
}

你现在的工作是离开,研究示例,研究参考教程,研究相关的 API 文档,并弄清楚如何在你的圆圈内对齐上述形状并绘制它的腿......

一个提示。制作一个“Bug”类,它知道如何渲染所有这些,并Graphics根据需要简单地翻译位置......

于 2013-05-09T05:05:05.593 回答