chunye19950806
2015-05-26 10:27
采纳率: 50%
浏览 5.7k
已采纳

java如何画圆弧!!!!

知道一个圆弧的两个端点和终点还有角度,怎么将这个圆弧画出来?用java,说出具体的方法及过程,谢谢了!

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • JonsonJiao 2015-05-27 03:46
    已采纳

    想了想你这个问题,你这个需要解方程来确定圆弧所在圆或椭圆的方程的,而这个实现起来是比较麻烦的,我试着写了一下,没有写完,需要考虑的条件很多,有些复杂,先说下思路吧:
    1、先假设三个点落在圆上,圆相比椭圆要好一些;
    1)根据三个点的坐标求出圆心和半径来
    因为知道三个点的坐标,根据圆的方程是可以求出方程中的三个参数的,如果直接用圆方程求会比较麻烦,涉及到二次运算;
    可以使用另一种方式,即起点和中点连线的中垂线与终点和中点连线的中垂线相交就是圆心了。
    求出圆心后就能知道半径了,这样就确定了圆的方程,比如是(x-a)*(x-a)+(y-b)*(y-b)=r*r,a,b是圆心,r是半径
    2)其实这时候要判断假设的对不对了,如果假设圆正确,那么圆心与两个端点的夹角与给定的圆弧对应角度应该是一样的,否则不一样
    已知圆心O(a,b)与两个端点(如A(x1,y1)和B(x2,y2))的坐标,可以使用余弦定理求出角AOB的度数,这个不难请自行百度。
    2-1假设通过检测的话说明三个点就是在圆上,
    2-1-1)有了圆的方程就知道圆的外接矩形的左上角坐标和宽度、高度了
    左上角坐标x=a-r,y=b-r,width=r+r,height=r+r;
    需要这些参数是因为画弧线的方法中需要使用到这些参数。
    2-1-2)求起始的角度
    起始角度也是绘制圆弧所需要的参数,这个的计算可以通过起始端点与圆心连线的斜率来求,这个里面也要分情况,需要说明的是在Java中绘制圆弧的起始角度0表示水平正值方向,
    比如起始端点为(1,0),那么起始角度为0,起始端点为(0,1),那么起始角度为90,这里用度表示,使用中也是。
    注意起始端点在四个象限分别处理起始的角度。
    2-1-3)求终止角度,有了起始角度加上给定的弧度对应角度就是终止角度了。
    2-1-4)绘制
    最后调用drawArc(x,y,width,height,startAngle,endAngle)就可以绘制了。

    2-2)假设没有通过检测,说明三个点不在圆上,需要计算椭圆的方程了。
        这个没有具体的写代码,先看看上面的是否符合要求吧。
    
    已采纳该答案
    打赏 评论
  • guwei4037 2015-05-26 10:31
    打赏 评论
  • 自己去搜索java canvas

    打赏 评论
  • DZL_ACE 2015-05-26 11:54

    用 drawOval(int x,int y,int w,int h); x,y代表坐标 w,h代表宽度和高度 比如
    drawOval(50,50,50,100);这是一个椭形,
    drawOval(50,50,50,50); 这是一个圆形.

    打赏 评论
  • qq_27361099 2015-05-26 14:44

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import javax.swing.JFrame;

    public class TestDrawArc extends JFrame{
    MyCanvas1 cnv;

    public TestDrawArc(){
    super("半圆");
    cnv = new MyCanvas1();
    this.add(cnv);
    this.setSize(500, 500);
    this.setVisible(true);
    }

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

    class MyCanvas1 extends Canvas{
    public MyCanvas1(){
    super();
    }

    public void paint(Graphics g){
    super.paint(g);
    g.setColor(Color.red);
    g.drawArc(50, 50, 300, 300, 0, 180);
    }
    }

    drawArc有6个参数:
    前面两个圆的外切矩形左上角的坐标点,中间两个是外切矩形的宽和高,倒数第二个是弧的起始角度,最后一个是弧的跨越角度。

    打赏 评论
  • chunye19950806 2015-05-26 14:57

    求不要回答什么自己去搜索了 我就是搜索不到才来提问的 要是能搜索到还来提问干什么 也不要复制粘贴了 没什么技术含量 求大神!!

    打赏 评论
  • sirnuo 2015-05-27 01:38

    //RectF oval=new RectF(); //RectF对象

    oval.left=100; //左边

    oval.top=400; //上边

    oval.right=400; //右边

    oval.bottom=700; //下边

    canvas.drawArc(oval, 200, 135, true, paint); //绘制圆弧

    一个椭圆对象,就是这个椭圆的外切矩形框。 RectF 的左上坐标和右下坐标确定了,那么内切椭圆也就确定了。
    起始角度是从最右边开始的,为0度; 最下边的点就是90度;同理,其他点根据数学公式,弧长和角度的转换,可以计算出来。
    你动手多画个几次,自然就能理解意思了。

    打赏 评论
  • JonsonJiao 2015-05-28 01:45

    public class Point {

    private double xValue;
    private double yValue;
    
    public Point(double xValue, double yValue) {
        this.setxValue(xValue);
        this.setyValue(yValue);
    }
    
    public double distance(Point point) {
        double distance = Math.sqrt(Math.pow((point.getxValue() - this.xValue),
                2) + Math.pow((point.getyValue() - this.yValue), 2));
        return distance;
    }
    
    /**
     * @return the xValue
     */
    public double getxValue() {
        return xValue;
    }
    
    /**
     * @param xValue
     *            the xValue to set
     */
    public void setxValue(double xValue) {
        this.xValue = xValue;
    }
    
    /**
     * @return the yValue
     */
    public double getyValue() {
        return yValue;
    }
    
    /**
     * @param yValue
     *            the yValue to set
     */
    public void setyValue(double yValue) {
        this.yValue = yValue;
    }
    
    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "点(" + this.xValue + "," + this.yValue + ")";
    }
    
    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Point) {
            Point comparePoint = (Point) obj;
            return this.getxValue() == comparePoint.getxValue()
                    && this.getyValue() == comparePoint.getyValue();
        }
        return super.equals(obj);
    }
    
    /**
     * 以基准点为圆心,从x轴方向逆时针旋转到基准点与point点连线经过的角度,必须保证传入点与基准点不是同一个点
     * 
     * @param point
     * @return
     */
    public double getAngle(Point point) {
        if (this.getxValue() == point.getxValue()) {
            if (this.getyValue() < point.getyValue()) {
                return 90;
            } else {
                return 270;
            }
        } else if (this.getyValue() == point.getyValue()) {
            if (this.getxValue() < point.getxValue()) {
                return 0;
            } else {
                return 180;
            }
        } else {
            double kValue = (getKValue(point));
            int quadrant = getQuadrant(point);
            double angle = Math.atan(kValue) * 180 / Math.PI;
            if (quadrant != 1) {
                if (quadrant == 2 || quadrant == 3) {
                    return angle + 180;
                } else {
                    return angle + 360;
                }
            }
            return angle;
        }
    }
    
    /**
     * 求传入的点在调用点的哪个象限内,想对传入点的坐标平移到0,0标准坐标系下,然后通过平移后的坐标正负值进行判定
     * 
     * @param point
     * @return 返回值1,2,3,4分别代表四个象限
     */
    private int getQuadrant(Point point) {
        double transPointX = point.getxValue() - this.getxValue();
        double transPointY = point.getyValue() - this.getyValue();
        if (transPointX > 0 && transPointY > 0) {
            return 1;
        } else if (transPointX < 0 && transPointY > 0) {
            return 2;
        } else if (transPointX < 0 && transPointY < 0) {
            return 3;
        } else {
            return 4;
        }
    }
    
    /**
     * 获取斜率
     * 
     * @param point
     * @return
     */
    private double getKValue(Point point) {
        double kValue = (point.getyValue() - this.getyValue()) * 1.0d
                / (point.getxValue() - this.getxValue());
        return kValue;
    }
    
    public static void main(String[] args) {
        Point pointA = new Point(0, 0);
        Point pointB = new Point(0, -1);
        double angle = pointA.getAngle(pointB);
        System.out.println(pointA.toString() + "与" + pointB.toString()
                + "之间的夹角为:" + angle);
    }
    

    }
    我后来想了下如何计算角度的问题,这是我写的一个类,里面有求距离和角度的方法,你可以参考下。

    打赏 评论

相关推荐 更多相似问题