2 chunye19950806 chunye19950806 于 2015.05.26 18:27 提问

java如何画圆弧!!!!

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

8个回答

tongyi55555
tongyi55555   2015.05.27 11: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)假设没有通过检测,说明三个点不在圆上,需要计算椭圆的方程了。
    这个没有具体的写代码,先看看上面的是否符合要求吧。
chunye19950806
chunye19950806 好答案 圆弧所在圆的半径和圆心都知道了 就是难弄起始角度 没想到java话一个圆弧那么麻烦啊!!
大约 3 年之前 回复
guwei4037
guwei4037   Ds   Rxr 2015.05.26 18:31
chunye19950806
chunye19950806 看过了 但是不知道怎么求那个椭圆对象和起始角度。。。求解答!!
大约 3 年之前 回复
q3733353520
q3733353520   2015.05.26 18:35

自己去搜索java canvas

chunye19950806
chunye19950806 回复linux_liyi: 得到答案了 谢谢了 能来回答也是一种好的 只是希望尽量能给别人一个明确的答案
大约 3 年之前 回复
q3733353520
q3733353520 回复chunye19950806: 我懂了,你是不会这种几何问题吧
大约 3 年之前 回复
q3733353520
q3733353520 回复chunye19950806: 你那是漫无目的的搜索,而我只是给你指一个方向,而且搜索不只有百度
大约 3 年之前 回复
chunye19950806
chunye19950806 我能搜到还用提问吗?我又不傻 不知道百度啊
大约 3 年之前 回复
DZL_ACE
DZL_ACE   2015.05.26 19:54

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

chunye19950806
chunye19950806 。。。。。 是画圆弧 不是画圆或者椭圆 麻烦看清楚题目
大约 3 年之前 回复
qq_27361099
qq_27361099   2015.05.26 22: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
chunye19950806 能不能不要复制粘贴 我看过这个 没有技术含量 我要的是动态画圆弧 不是定量画圆弧 比如我随便给你一个圆上的两点和这两点形成的圆弧的中点 还有圆弧对应的角度 你将这个圆弧画出来
大约 3 年之前 回复
chunye19950806
chunye19950806   2015.05.26 22:57

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

sirnuo
sirnuo   2015.05.27 09: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度;同理,其他点根据数学公式,弧长和角度的转换,可以计算出来。
你动手多画个几次,自然就能理解意思了。

tongyi55555
tongyi55555   2015.05.28 09: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);
}

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!