重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、先要知道怎么画圆
成都创新互联专业为企业提供新吴网站建设、新吴做网站、新吴网站设计、新吴网站制作等企业网站建设、网页设计与制作、新吴企业网站模板建站服务,十多年新吴做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
2、设置画笔的位置
3、定时器不断改变圆的半径,重绘
4、改变半径之后,判断是否超过200
5、超过200,改变圆心位置,重新绘制圆
会有点小BUG:我这里只是示范了用鼠标点击 使得一个圆移动位置 其他都写在main函数里 你的getDistance()方法我实在不知道你什么意思。。。
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
/*
* Classname: drawyuan.java
*
* Author: zenglulin
*
* Version information: V1.0
*
* Date: 2010-6-7
*
* Copyright notice: Copyright (c) 2009, Openmobi Co.Ltd. All rights reserved.
*
* Description: TODO
*/
/**
* @author zenglulin
*
*/
public class drawyuan
{
/**
*
*/
public drawyuan()
{
// TODO Auto-generated constructor stub
}
/**
* TODO
* @param args
* return: void
* author: zenglulin
* time: 上午10:11:33
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
MyFrame frame = new MyFrame("yuanceshi");
frame.Yuan1.move(frame.p3);
frame.Yuan2.move(frame.p4); //程序里直接移动
System.out.println("圆1的直径是:" + frame.Yuan1.getDiameter());
System.out.println("圆2的直径是:" + frame.Yuan2.getDiameter());
if(frame.Yuan1.hasintersection(frame.Yuan2))
System.out.println("圆1和圆2相交");
else {
System.out.println("圆1和圆不相交");
}
if(frame.Yuan1.smaller(frame.Yuan2) 0)
System.out.println("圆1比圆2小 ");
else if(frame.Yuan1.smaller(frame.Yuan2) 0)
System.out.println("圆1比圆2大 ");
else
System.out.println("圆1和圆2大小相等 ");
}
}
class MyFrame extends JFrame
{
/* serialVersionUID: long*/
private static final long serialVersionUID = 1L;
public MyFrame(String title)
{
super(title);
init();
JPanel p =new JPanel();
Container c = getContentPane();
c.add(p);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//点击鼠标移动圆
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent event)
{
Point p = event.getPoint();
Yuan1.move(p);
if(Yuan1.hasintersection(Yuan2))
System.out.println("圆1和圆2相交");
else {
System.out.println("圆1和圆不相交");
}
repaint();
// validate();
}
});
setSize(200, 100);
d = getSize();
p3 = new Point(61, d.height /2 + 10 );
p4 = new Point(105, d.height /2+ 10);
setVisible(true);
repaint();
validate();
}
public void init()
{
p1 = new Point(30, 30);
p2 = new Point(95, 30);
r1 = 20;
r2 = 25;
Yuan1 = new Yuan(p1, r1);
Yuan2 = new Yuan(p2, r2);
}
public void update(Graphics g)
{
Yuan1.draw(g);
Yuan2.draw(g);
}
public void paint(Graphics g)
{
super.paintComponents(g);
Yuan1.draw(g);
Yuan2.draw(g);
}
Point p1,p2,p3,p4;
int r1,r2;
Yuan Yuan1,Yuan2;
Dimension d;
}
class Yuan
{
public Yuan(Point p, int r)
{
this.point = p;
this.radius = r;
}
private int radius; //半径
public int getRadius()
{
return radius;
}
public void setRadius(int radius)
{
this.radius = radius;
}
public Point getPoint()
{
return point;
}
public void setPoint(Point point)
{
this.point = point;
}
public void move(Point point)
{
setPoint(point);
}
/**
* TODO 我不知道你说的这个距离是什么意思
* @param other
* @return
* return: int
* author: zenglulin
* time: 上午10:26:45
*/
public int getDistance (Yuan other)
{
return 0;
}
public boolean hasintersection(Yuan other)
{
return (int)getPoint().distance(other.getPoint())
radius + other.getRadius();
}
public int getDiameter() //获得直径
{
return 2* radius;
}
/**
* TODO 比较大小
* @param other
* @return
* return: int -1 当前圆更小 1--当前圆更大 0 相等
* author: zenglulin
* time: 上午10:27:21
*/
public int smaller(Yuan other)
{
// TODO Auto-generated method stub
if(radius other.getRadius())
return -1;
else if(radius other.getRadius())
return 1;
else
return 0;
}
public void draw(Graphics g)
{
g.drawOval((int)point.getX() - radius, (int)point.getY() - radius, 2*radius, 2*radius);
}
private Point point; //圆心坐标点
}
写一个鼠标事件处理程序,当鼠标按下时记录下所在位置,当松开时记录下所在位置,2点就都得到了。如果想实现拖曳的效果,那么当鼠标按下时就开始,每隔一段时间记录鼠标所在位置,根据2点画椭圆,直到鼠标松开为止,获得最终椭圆
2点确定椭圆和2点确定矩形是一样的,这个椭圆就是被这个矩形包围的最大椭圆,矩形宽为椭圆短轴,长为长轴,矩形中心为椭圆圆心。
用JFrame做;
实现重绘repaint方法;
drawCircle方法即可。
例如如下例子:
public class Draw extends JFrame {
private int x, y;
boolean isVisible = false;
public Draw () {
addHandler();
setSize(500, 500);
setLocation(350, 150);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Draw ();
}
private void addHandler() {
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
x = e.getX();
y = e.getY();
isVisible = true;
repaint();
} else if (e.getButton() == MouseEvent.BUTTON3) {
isVisible = false;
repaint();
}
}
});
}
public void paint(Graphics g) {
super.paint(g);
if(isVisible){
g.setColor(Color.red);
g.drawOval(x, y, 100, 100);
}
}
}
这个问题稍微复杂,不是一时半会能说清的。
你可以看看 网易公开课——《编程方法》,一定能解决你的问题,一定能。但是你要沉下心来仔细看,对你编程素养的提高大有帮助。
只要思路的话,请看
当你了一个轨迹,执行循环:
每次移动一小步;
循环结束
翻译成计算机算法
while(条件){ //这其实是个动画,所以要连续移动多步,while的作用在于此
move(dx,dy); // move(dx,dy)是 你自己编写的函数,让圆在 x、y方向上分别移动dx和dy个像素
dx = ?
dy = ? //dx 和 dy发生变化,至于怎么变化要看你需要什么轨迹
}
其实也挺简单的,语言细节绝非编程本质,程序的本质是人类世界在电脑中的模拟。先认清楚本质是什么再去编程。