java如何画圆弧!!!!
知道一个圆弧的两个端点和终点还有角度,怎么将这个圆弧画出来?用java,说出具体的方法及过程,谢谢了!
-
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); } }
-
想了想你这个问题,你这个需要解方程来确定圆弧所在圆或椭圆的方程的,而这个实现起来是比较麻烦的,我试着写了一下,没有写完,需要考虑的条件很多,有些复杂,先说下思路吧: 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)假设没有通过检测,说明三个点不在圆上,需要计算椭圆的方程了。 这个没有具体的写代码,先看看上面的是否符合要求吧。
发表回复