一个痛苦的算法(swing) 如何用swing画一个圆,平均分成N份,在这些扇形里面分别画上内切圆。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.awt.*; import java.awt.event.*; public class DrawOval extends JFramwe{ public DrawOval() { super("画圆"); setBounds(0,0,100,100); setVisible(true); } public void paint(Graphics g) { g.setColor(Color.red);//画红圆 g.drawOval(0,0,100,100);//在50,50处画一个半径为50的圆 } public static void main(String[] args) { DrawOval do=new DrawOval(); } }//如果能理解画圆的话,那么我绝对相信楼主有能力解决后续问题。 import java.awt.Color;import java.awt.Graphics;public class ArcPanel extends javax.swing.JPanel { boolean filled; int slice = 8; int n = 360 / slice; double counts = 4; int[] row; /** Creates new form ArcPanel */ public ArcPanel() { initComponents(); } public ArcPanel(boolean filled) { this.filled = filled; } @Override public void paint(Graphics g) { g.setColor(Color.yellow); if (filled) { g.drawArc(0, 0, diameter, diameter, 0, n); } else { g.drawArc(0, 0, diameter, diameter, 45, 45); } // 在第一个扇形内画矩形(三点钟时刻开始) int R = diameter / 2; int r = (int) ((int) R * Math.tan(Math.PI / slice) * Math.tan((Math.PI / 2 - Math.PI / slice) / 2)); //圆心1坐标(R+r/(Math.tan(Math.PI/slice)),R-r) //正方形1交点 (R+r/Math.tan(Math.PI/slice)-r/Math.sqrt(2),(R-r-r/Math.sqrt(2))) int b1 = (int) ((int) r / Math.sqrt(2)); int ox = (int) (R + r / (Math.tan(Math.PI / slice))); int oy = R - r; int x1 = (int) ((int) R + r / Math.tan(Math.PI / slice) - r / Math.sqrt(2)); int y1 = (int) (R - r - r / Math.sqrt(2)); g.drawOval(x1, y1, 2 * b1, 2 * b1); g.drawRect(x1, y1, 2 * b1, 2 * b1); g.setColor(Color.green); if (filled) { g.fillArc(0, 0, diameter, diameter, 360 / slice, n); } else { g.drawArc(0, 0, diameter, diameter, 135, -45); } //圆心2坐标(R+r,R-r/(Math.tan(Math.PI/slice)) //正方形2交点 (R+r-r/Math.sqrt(2),R-r/(Math.tan(Math.PI/slice)-r/Math.sqrt(2)) int x2 = (int) (R + r - r / Math.sqrt(2)); int y2 = (int) (R - r/(Math.tan(Math.PI / slice) - r / Math.sqrt(2))); int b2 = (int) ((int) r / Math.sqrt(2)); System.out.println("x2:" + x2); g.drawRect(x2, y2, 2 * b2, 2 * b2); g.setColor(Color.orange); if (filled) { g.fillArc(0, 0, diameter, diameter, 2 * 360 / slice, n); } else { g.drawArc(0, 0, diameter, diameter, 135, -45); }// g.setColor(Color.magenta); if (filled) { g.fillArc(0, 0, diameter, diameter, 3 * 360 / slice, n); } else { g.drawArc(0, 0, diameter, diameter, -225, 45); } g.setColor(Color.yellow); if (filled) { g.fillArc(0, 0, diameter, diameter, 4 * 360 / slice, n); } else { g.drawArc(0, 0, diameter, diameter, 225, -45); }//// g.setColor(Color.green); if (filled) { g.fillArc(0, 0, diameter, diameter, 5 * 360 / slice, n); } else { g.drawArc(0, 0, diameter, diameter, -135, 45); } g.setColor(Color.orange); if (filled) { g.fillArc(0, 0, diameter, diameter, 6 * 360 / slice, n); } else { g.drawArc(0, 0, diameter, diameter, -45, -45); }// g.setColor(Color.magenta); if (filled) { g.fillArc(0, 0, diameter, diameter, 7 * 360 / slice, 45); } else { g.drawArc(0, 0, diameter, diameter, 315, 45); } } // end paint() /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 371, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 276, Short.MAX_VALUE) ); }// </editor-fold> // Variables declaration - do not modify // End of variables declaration } gentalguo 帮忙解决下,我解决不了,懂的早就可以解决,不懂,始终做不出来啊,解决了全部分都给啊。呵呵 好了好了,开玩笑的~~package test.arc;import java.awt.BorderLayout;import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Box;import javax.swing.BoxLayout;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField;public class MultiArc extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; JTextField ftf; MultiArcPanel p; public MultiArc() { super(); setDefaultCloseOperation(EXIT_ON_CLOSE); p = new MultiArcPanel(); Container c = getContentPane(); c.add(p, BorderLayout.CENTER); ftf = new JTextField("1", 10); JButton okButton = new JButton("OK"); okButton.addActionListener(this); Box ctrlBox = new Box(BoxLayout.X_AXIS); ctrlBox.add(Box.createGlue()); ctrlBox.add(ftf); ctrlBox.add(Box.createHorizontalStrut(2)); ctrlBox.add(okButton); ctrlBox.add(Box.createGlue()); c.add(ctrlBox, BorderLayout.SOUTH); setSize(550, 450); setVisible(true); } public void actionPerformed(ActionEvent e) { String text = ftf.getText(); int num = 1; try { num = Integer.parseInt(text); } catch (Exception ex) { num = 1; } if (360 % num != 0) { ftf.setText("1"); return; } p.setN(num); p.repaint(); } public static void main(String args[]) { new MultiArc(); }}package test.arc;import java.awt.Graphics;import java.awt.Point;import javax.swing.JPanel;public class MultiArcPanel extends JPanel { private static final long serialVersionUID = 1L; private int n = 2; int radius; int centerX; int centerY; double inc = (2 * PI / n) % (2 * PI); private static final double PI = Math.PI; public MultiArcPanel() { super(); } public void paint(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); int width = getWidth() - 20; int height = getHeight() - 20; centerX = width / 2; centerY = height / 2; radius = Math.min(width, height) / 2; g.drawOval(centerX - radius, centerY - radius, 2 * radius, 2 * radius); if (n > 1) { double angle = 0.0; for (int i = 0; i < n; i++) { Point endPoint = getEndPoint(angle); g.drawLine(centerX, centerY, endPoint.x, endPoint.y); int innerRadius = (int) (radius * Math.sin(inc / 2) / (1 + Math .sin(inc / 2))); Point innerCenter = getInnerCircleCenter(angle, innerRadius); g.drawOval(innerCenter.x - innerRadius, innerCenter.y - innerRadius, 2 * innerRadius, 2 * innerRadius); angle += (2 * PI / n) % (2 * PI); } } } private Point getEndPoint(double startAngle) { Point rsPoint = new Point(); double endAngle = (startAngle + inc) % (2 * PI); rsPoint.x = (int) (centerX + radius * Math.cos(endAngle)); rsPoint.y = (int) (centerY + radius * Math.sin(endAngle)); return rsPoint; } public void setN(int n) { this.n = n; inc = (2 * PI / n) % (2 * PI); } private Point getInnerCircleCenter(double startAngle, int innerRadius) { Point rsPoint = new Point(); rsPoint.x = (int) (centerX + (radius - innerRadius) * Math.cos(startAngle + inc / 2)); rsPoint.y = (int) (centerY + (radius - innerRadius) * Math.sin(startAngle + inc / 2)); return rsPoint; }}两个类~~^_^加油~~共同学习,共同进步。 gentalguo 好神速啊,非常感谢啊,我去试运行下。嘿嘿,多谢啊! gentalguo,你运行没有报错?我运行报错了哦!Exception in thread "main" java.lang.ExceptionInInitializerError at test.arc.MultiArc.<init>(MultiArc.java:32) at test.arc.MultiArc.main(MultiArc.java:74)Caused by: java.lang.RuntimeException: Uncompilable source code - 类 MultiArcPanel 是公共的,应在名为 MultiArcPanel.java 的文件中声明 at graphics1.MultiArcPanel.<clinit>(MultiArcPanel%20.java:8) ... 2 more jdk1.6,eclipse3.2,我的环境啊奇怪~~ 刚运行过了。完全可以。你把包去掉,然后直接用dos就可以编译了。 求java 用exchange 发送邮件 jquery是个好东西 有转让SCJP考试卷的吗?南京的本地交易 算法:1~N中求出1的个数,(如果11 那1的个数就是2) 高手来看一下(难度五星) java是什么 Java中的参数都是传值,那怎么交换两个变量的值呢。 请教各位,一个小迷惑,为什么main函数也需要throws Throwable? java读文件,比如有文件中有8个字节是double型,怎么它读出来,也转为double java 静态变量 java集合框架和I/O流 怎么获得JComboBox的箭头对象,或者删掉这个箭头只显示可编辑框
import java.awt.*;
import java.awt.event.*;
public class DrawOval extends JFramwe{
public DrawOval()
{
super("画圆");
setBounds(0,0,100,100);
setVisible(true);
}
public void paint(Graphics g)
{
g.setColor(Color.red);//画红圆
g.drawOval(0,0,100,100);//在50,50处画一个半径为50的圆
}
public static void main(String[] args)
{
DrawOval do=new DrawOval();
}
}//如果能理解画圆的话,那么我绝对相信楼主有能力解决后续问题。
import java.awt.Graphics;
public class ArcPanel extends javax.swing.JPanel { boolean filled; int slice = 8;
int n = 360 / slice;
double counts = 4;
int[] row; /** Creates new form ArcPanel */
public ArcPanel() {
initComponents();
} public ArcPanel(boolean filled) {
this.filled = filled;
}
@Override
public void paint(Graphics g) { g.setColor(Color.yellow);
if (filled) {
g.drawArc(0, 0, diameter, diameter, 0, n); } else {
g.drawArc(0, 0, diameter, diameter, 45, 45);
} // 在第一个扇形内画矩形(三点钟时刻开始)
int R = diameter / 2;
int r = (int) ((int) R * Math.tan(Math.PI / slice) * Math.tan((Math.PI / 2 - Math.PI / slice) / 2));
//圆心1坐标(R+r/(Math.tan(Math.PI/slice)),R-r)
//正方形1交点 (R+r/Math.tan(Math.PI/slice)-r/Math.sqrt(2),(R-r-r/Math.sqrt(2)))
int b1 = (int) ((int) r / Math.sqrt(2));
int ox = (int) (R + r / (Math.tan(Math.PI / slice)));
int oy = R - r;
int x1 = (int) ((int) R + r / Math.tan(Math.PI / slice) - r / Math.sqrt(2));
int y1 = (int) (R - r - r / Math.sqrt(2)); g.drawOval(x1, y1, 2 * b1, 2 * b1);
g.drawRect(x1, y1, 2 * b1, 2 * b1); g.setColor(Color.green);
if (filled) {
g.fillArc(0, 0, diameter, diameter, 360 / slice, n);
} else {
g.drawArc(0, 0, diameter, diameter, 135, -45);
} //圆心2坐标(R+r,R-r/(Math.tan(Math.PI/slice))
//正方形2交点 (R+r-r/Math.sqrt(2),R-r/(Math.tan(Math.PI/slice)-r/Math.sqrt(2))
int x2 = (int) (R + r - r / Math.sqrt(2));
int y2 = (int) (R - r/(Math.tan(Math.PI / slice) - r / Math.sqrt(2)));
int b2 = (int) ((int) r / Math.sqrt(2));
System.out.println("x2:" + x2);
g.drawRect(x2, y2, 2 * b2, 2 * b2);
g.setColor(Color.orange);
if (filled) {
g.fillArc(0, 0, diameter, diameter, 2 * 360 / slice, n);
} else {
g.drawArc(0, 0, diameter, diameter, 135, -45);
}
//
g.setColor(Color.magenta); if (filled) {
g.fillArc(0, 0, diameter, diameter, 3 * 360 / slice, n);
} else {
g.drawArc(0, 0, diameter, diameter, -225, 45);
} g.setColor(Color.yellow);
if (filled) {
g.fillArc(0, 0, diameter, diameter, 4 * 360 / slice, n);
} else {
g.drawArc(0, 0, diameter, diameter, 225, -45);
}
////
g.setColor(Color.green);
if (filled) {
g.fillArc(0, 0, diameter, diameter, 5 * 360 / slice, n);
} else {
g.drawArc(0, 0, diameter, diameter, -135, 45);
} g.setColor(Color.orange);
if (filled) {
g.fillArc(0, 0, diameter, diameter, 6 * 360 / slice, n);
} else {
g.drawArc(0, 0, diameter, diameter, -45, -45);
}
//
g.setColor(Color.magenta);
if (filled) {
g.fillArc(0, 0, diameter, diameter, 7 * 360 / slice, 45);
} else {
g.drawArc(0, 0, diameter, diameter, 315, 45);
}
} // end paint() /** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 371, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 276, Short.MAX_VALUE)
);
}// </editor-fold>
// Variables declaration - do not modify
// End of variables declaration
}
解决了全部分都给啊。呵呵
package test.arc;import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;public class MultiArc extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; JTextField ftf; MultiArcPanel p; public MultiArc() {
super();
setDefaultCloseOperation(EXIT_ON_CLOSE);
p = new MultiArcPanel();
Container c = getContentPane();
c.add(p, BorderLayout.CENTER); ftf = new JTextField("1", 10); JButton okButton = new JButton("OK");
okButton.addActionListener(this); Box ctrlBox = new Box(BoxLayout.X_AXIS);
ctrlBox.add(Box.createGlue());
ctrlBox.add(ftf);
ctrlBox.add(Box.createHorizontalStrut(2));
ctrlBox.add(okButton);
ctrlBox.add(Box.createGlue()); c.add(ctrlBox, BorderLayout.SOUTH); setSize(550, 450);
setVisible(true);
} public void actionPerformed(ActionEvent e) {
String text = ftf.getText();
int num = 1;
try {
num = Integer.parseInt(text);
} catch (Exception ex) {
num = 1;
} if (360 % num != 0) {
ftf.setText("1");
return;
} p.setN(num);
p.repaint(); } public static void main(String args[]) {
new MultiArc();
}
}package test.arc;import java.awt.Graphics;
import java.awt.Point;import javax.swing.JPanel;public class MultiArcPanel extends JPanel { private static final long serialVersionUID = 1L; private int n = 2; int radius; int centerX; int centerY; double inc = (2 * PI / n) % (2 * PI); private static final double PI = Math.PI; public MultiArcPanel() {
super();
} public void paint(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); int width = getWidth() - 20;
int height = getHeight() - 20;
centerX = width / 2;
centerY = height / 2;
radius = Math.min(width, height) / 2;
g.drawOval(centerX - radius, centerY - radius, 2 * radius, 2 * radius); if (n > 1) {
double angle = 0.0;
for (int i = 0; i < n; i++) {
Point endPoint = getEndPoint(angle);
g.drawLine(centerX, centerY, endPoint.x, endPoint.y); int innerRadius = (int) (radius * Math.sin(inc / 2) / (1 + Math
.sin(inc / 2)));
Point innerCenter = getInnerCircleCenter(angle, innerRadius);
g.drawOval(innerCenter.x - innerRadius, innerCenter.y
- innerRadius, 2 * innerRadius, 2 * innerRadius);
angle += (2 * PI / n) % (2 * PI);
}
}
} private Point getEndPoint(double startAngle) {
Point rsPoint = new Point(); double endAngle = (startAngle + inc) % (2 * PI);
rsPoint.x = (int) (centerX + radius * Math.cos(endAngle));
rsPoint.y = (int) (centerY + radius * Math.sin(endAngle));
return rsPoint;
} public void setN(int n) {
this.n = n;
inc = (2 * PI / n) % (2 * PI);
} private Point getInnerCircleCenter(double startAngle, int innerRadius) {
Point rsPoint = new Point();
rsPoint.x = (int) (centerX + (radius - innerRadius)
* Math.cos(startAngle + inc / 2));
rsPoint.y = (int) (centerY + (radius - innerRadius)
* Math.sin(startAngle + inc / 2));
return rsPoint;
}
}
两个类~~^_^
加油~~共同学习,共同进步。
Exception in thread "main" java.lang.ExceptionInInitializerError
at test.arc.MultiArc.<init>(MultiArc.java:32)
at test.arc.MultiArc.main(MultiArc.java:74)
Caused by: java.lang.RuntimeException: Uncompilable source code - 类 MultiArcPanel 是公共的,应在名为 MultiArcPanel.java 的文件中声明
at graphics1.MultiArcPanel.<clinit>(MultiArcPanel%20.java:8)
... 2 more
奇怪~~