关于Arc2D的角度问题

        用过JAVA 2D中的Arc2D类的就会发现,画出来的圆弧的角度与构造函数中的角度并不一致.通过查看Arc2D的源代码可以发现,Arc2D是这样生成圆弧的:首先使用给定的起始角度与跨越角度生成一个半径为1的标准单位圆弧,然后通过伸缩变换,将其转换为构造函数中指定的椭圆上的圆弧.显然,这样得到圆弧的起始角与跨度角与构造函数中的已经不一样了,除非这个椭圆本来就是个圆,或者其角度为90的倍数.

        既然知道了Arc2D的生成原理,通过简单三角变换,我们很容易通过角度变换使用Arc2D生成我们需要的圆弧.下面的代码就是将圆弧的实际角度转换为Arc2D的参数角度:

java 代码
  1. public   static   double  degreeTranslate( double  width, double  height, double  degree){   
  2.       double  radian =Math.toRadians(degree);   
  3.       double  trans  =Math.atan2(width*Math.sin(radian),height*Math.cos(radian));   
  4.       double  angle =Math.toDegrees(trans);   
  5.       return  angle> 0 ?angle: 360 +angle;   
  6.  }  

 

       下面,我们通过一个完整的程序来显示这段代码的正确性:

java 代码
  1. import  java.awt.*;   
  2. import  java.awt.event.*;   
  3. import  java.awt.geom.*;   
  4. import  javax.swing.*;   
  5. /**  
  6. *Arc2D中角度变换的测试程序  
  7. *@author Eastsun  
  8. *@Version 1.0  
  9. */   
  10. public   class  ArcT  extends  JFrame  implements  ActionListener,FocusListener{   
  11.      public   static   double  degreeTranslate( double  width, double  height, double  degree){   
  12.          double  radian =Math.toRadians(degree);   
  13.          double  trans  =Math.atan2(width*Math.sin(radian),height*Math.cos(radian));   
  14.          double  angle =Math.toDegrees(trans);   
  15.          return  angle> 0 ?angle: 360 +angle;   
  16.     }   
  17.        
  18.      public   static  Arc2D createArc( double  x, double  y, double  width, double  height, double  start, double  extent, int  type){   
  19.          double  nStart =degreeTranslate(width,height,start);   
  20.          double  nExtent = 0 ;   
  21.          if (extent>= 360 ||extent<=- 360 ) nExtent = 360 ;   
  22.          else {     
  23.             nExtent =degreeTranslate(width,height,start+extent)-nStart;   
  24.              if (extent< 0 &&nExtent> 0 ) nExtent =nExtent - 360 ;   
  25.              if (extent> 0 &&nExtent< 0 ) nExtent =nExtent + 360 ;   
  26.         }   
  27.          return   new  Arc2D.Double(x,y,width,height,nStart,nExtent,type);   
  28.     }   
  29.        
  30.      private  Arc2D arcA,arcB;   
  31.      private   double  start,extent;   
  32.      private  JTextField startField,extentField;   
  33.      private  Stroke strokeB = new  BasicStroke( 3 .0f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER, 10 .0f, new   float []{ 5 , 20 , 5 , 10 }, 0 ),   
  34.                    strokeA = new  BasicStroke( 3 .0f),   
  35.                    strokeX = new  BasicStroke( 1 .0f);   
  36.                       
  37.      public  ArcT(){   
  38.          super ( "圆弧测试程序" );   
  39.         JPanel drawPanel = new  JPanel(){   
  40.              public   void  paintComponent(Graphics g){   
  41.                  super .paintComponent(g);   
  42.                 Graphics2D g2 =(Graphics2D)g;   
  43.                 g2.setPaint(Color.white);   
  44.                 g2.fillRect( 0 , 0 ,getWidth(),getHeight());   
  45.                 g2.setPaint(Color.black);   
  46.                 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);   
  47.                 g2.setStroke(strokeA);   
  48.                 g2.draw(arcA);   
  49.                 g2.setPaint(Color.red);   
  50.                 g2.setStroke(strokeB);   
  51.                 g2.draw(arcB);   
  52.                 g2.setStroke(strokeX);   
  53.                    
  54.                 g2.setPaint(Color.black);   
  55.                 g2.draw( new  Line2D.Double( new  Point( 160 , 120 ),arcA.getStartPoint()));   
  56.                 g2.draw( new  Line2D.Double( new  Point( 160 , 120 ),arcA.getEndPoint()));   
  57.                    
  58.                 g2.setPaint(Color.red);   
  59.                 g2.draw( new  Line2D.Double( new  Point( 160 , 120 ),arcB.getStartPoint()));   
  60.                 g2.draw( new  Line2D.Double( new  Point( 160 , 120 ),arcB.getEndPoint()));   
  61.             }   
  62.         };   
  63.         drawPanel.setPreferredSize( new  Dimension( 320 , 240 ));   
  64.         add(drawPanel,BorderLayout.CENTER);   
  65.            
  66.         JPanel setPanel = new  JPanel();   
  67.         setPanel.add( new  JLabel( "起始角度:" ));   
  68.         startField = new  JTextField( "0.0" , 6 );   
  69.         start = 0 ;   
  70.         startField.addActionListener( this );   
  71.         startField.addFocusListener( this );   
  72.         setPanel.add(startField);   
  73.            
  74.         setPanel.add( new  JLabel( "跨越角度:" ));   
  75.         extentField = new  JTextField( "90.0" , 6 );   
  76.         extent = 90 ;   
  77.         extentField.addActionListener( this );   
  78.         extentField.addFocusListener( this );   
  79.         setPanel.add(extentField);   
  80.            
  81.         arcA =createArc( 20 , 15 , 280 , 210 ,start,extent,Arc2D.OPEN);   
  82.         arcB = new  Arc2D.Double( 20 , 15 , 280 , 210 ,start,extent,Arc2D.OPEN);   
  83.         add(setPanel,BorderLayout.SOUTH);   
  84.            
  85.         pack();   
  86.         setResizable( false );   
  87.         setDefaultCloseOperation(EXIT_ON_CLOSE);   
  88.         setVisible( true );   
  89.            
  90.     }   
  91.      private   void  setArcByTextField(JTextField textField){   
  92.          double  value = 0 ;   
  93.          try {   
  94.             value =Double.parseDouble(textField.getText().trim());   
  95.         } catch (Exception e){   
  96.             textField.setText(String.valueOf(textField==startField?start:extent));   
  97.              return ;   
  98.         }   
  99.          if (textField==startField) start =value;   
  100.          else                       extent =value;   
  101.         arcA =createArc( 20 , 15 , 280 , 210 ,start,extent,Arc2D.OPEN);   
  102.         arcB = new  Arc2D.Double( 20 , 15 , 280 , 210 ,start,extent,Arc2D.OPEN);   
  103.         repaint();   
  104.     }   
  105.      public   void  focusGained(FocusEvent e){}   
  106.      public   void  focusLost(FocusEvent e){   
  107.         setArcByTextField((JTextField)e.getComponent());   
  108.     }   
  109.      public   void  actionPerformed(ActionEvent e){   
  110.         setArcByTextField((JTextField)e.getSource());   
  111.     }   
  112.      public   static   void  main(String[] args){   
  113.          new  ArcT();   
  114.     }   
  115. }  
损失函数(Arc-SoftmaxLoss) 原理 Arc-SoftmaxLoss = Arc-Softmax + NLLLoss。 softmax 是通过角度分类的,Arc-Softmax 加宽了角度间的分界线,从而达到加大类间距的目的。 softmax V = wx = cosθ·||w||·||x||( cosθ = 二范数归一化后的欧氏距离 = wx / ||w||·||x||)。 Si = exp(cosθ·||w||·||x||) / ∑exp(cosθ·||w||·||x||)。 Arc-Softmax(加大 θ 角度) 实验(手写数 阅读详情

相关推荐

Arc Scene千里江山图制作

使用Arc Scene进行三维地形操作,最终制作如封面的千里江山图。

ink_inkkkk的博客 1618

Arc2D绘制角度的问题

用过JAVA 2D中的Arc2D类的就会发现,画出来的圆弧的角度与构造函数中的角度并不一致.通过查看Arc2D的源代码可以发现,Arc2D是这样生成圆弧的:首先使用给定的起始角度与跨越角度生成一个半径为1的标准单位圆弧,然后通过伸缩变换,将其转换为构造函数中指定的椭圆上的圆弧.显然,这样得到圆弧的起始角与跨度角与构造函数中的已经不一样了,除非这个椭圆本来就是个圆,或者其角度为90的倍数. 既然知

msh1216的专栏 1182

Arc2D.Float定义float 精度、两端点到圆心闭合的弧

重点代码:new Arc2D.Float(200, 50, 100, 50, 0, 90, Arc2D.PIE); PIE 闭合类型,用于通过从弧段的起始点到完整椭圆的中心,再从圆心到弧段的结束点画直线来闭合的弧。

Java绘图,图像处理

Java绘图类 1.Graphics类 提供了绘图常用的方法,利用这些方法可以实现直线,矩形,多边形等文本,图片的绘制其操作主要包括颜色,字体,画笔,文本,图像等 2.Graphics2D类

qq_51553982的博客 3762

解决PADs VX2.7安装中的License失效与软件卡死问题

本文详细解析了PADs VX2.7安装过程中常见的License失效与软件卡死问题,提供了从破解工具选择、环境变量设置到输入法兼容性调整等实用解决方案。特别推荐使用Siemens EDA系列新版破解工具,并分享性能调优与定期维护技巧,帮助工程师高效解决安装难题。

weixin_29234239的博客 816

技术解析:ChangeFormer——基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer模型在遥感变化检测中的创新应用,该模型基于Transformer架构和孪生网络(Siamese Network),显著提升了变化检测的精度和效率。通过详细的技术实现和实战经验分享,展示了其在建筑物变化、森林监测等场景中的卓越表现,为相关领域的研究和应用提供了有力工具。

weixin_29102619的博客 497

java arc2d_Java Graphics - 如何使用Arc2D PIE绘制饼形

import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.geom.Arc2D;import javax.swing.JComponent;import javax.swing.JFrame;class MyCanvas extends JComponent {public v...

weixin_29770269的博客 482

告别编译臃肿!手把手教你为Arduino UNO打造超轻量级U8g2中文字库(附完整工具链)

本文详细介绍了如何为Arduino UNO打造超轻量级U8g2中文字库,解决默认字库占用大量存储空间的问题。通过自定义字体工具链,提取项目所需汉字并生成精简字库,显著减少程序体积。文章包含完整实现步骤、优化技巧及实战经验,帮助开发者在资源受限的微控制器上高效显示中文。

weixin_29274337的博客 260

Java标准教程:Java 2D绘图--第3章 基本几何图形

在之前的课程中,您已经学习了绘图的基本概念,包括坐标系和graphic 对象创建的基本信息。现在,您将了解2D 绘图类的更详细的信息。本科展示如何使用Graphics2D 类绘制基本的几何图形和任意的形状,以及如何使用花哨的轮廓和填充风格展示图形。这些主题分为以下几个章节。l         绘制基本几何图形:本节展示如何创建标准的集合图形,例如点,线,曲线,圆弧,矩形和椭圆。l         绘制任意图形:本节展示如何直接使用基本几何图形组合绘制任意形状,使用GeneralPath 类进行

Uoooo的专栏 4445

100天精通Python(基础篇)——第3天:运算符全解析(算术运算符、比较运算符、逻辑运算符、赋值运算符及其优先级规则)

100天精通Python(基础篇)——第3天:运算符全解析(算术运算符、比较运算符、逻辑运算符、赋值运算符及其优先级规则)

努力让自己发光,对的人才能迎着光而来 14万+

7、PPG信号处理与质量评估

本文详细介绍了PPG信号的处理与质量评估方法,包括信号滤波技术(如卷积和互相关)、滤波器选择、信号质量指标(SQI)的定义与应用,以及标注一致性的评估。同时,提供了MATLAB代码示例和操作步骤,并分析了不同指标的优势与适用场景,旨在提高PPG信号在诊断和监测中的准确性与可靠性。

salt的博客 255

java drawarc参数_Java Graphics drawArc具有高精度

我正在尝试使用AWT / Swing在Java中绘制高精度弧. Graphics类提供了“drawArc”方法来执行此操作,在大多数情况下这很好.但是,当弧具有较大的半径(即“宽度”和“高度”参数较大)时,弧将不会精确绘制.这是因为“startAngle”和“arcAngle”参数以整数度给出.我被迫将角度(以弧度给出)转换为度数然后将其舍入.精度的损失会导致电弧达不到其实际终点(如果你向下舍入)...

weixin_39972264的博客 621

rk3399开发环境的介绍

由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统性的介绍,尽可能的涵盖所有内容。

朝气蓬勃 711

java中drawArc参数的含义_高精度的Java圖形drawArc

I'm trying to draw a high precision arc in Java using AWT/Swing. The Graphics class offers the "drawArc" method to do this and in most cases this is fine. However, when the arc has a large radius (I.e...

weixin_42524401的博客 1181

从0到1构建数据分析AI Agent:数据采集、洞察生成与报告自动化

在企业数字化转型的今天,数据分析师80%的时间被消耗在重复取数、数据清洗、报表排版等低价值劳动上,真正用于深度业务洞察和决策支持的时间不足20%。本文将从核心概念、技术原理、代码实现、落地实践全维度,教你从0到1搭建一套完整的数据分析AI Agent系统,实现「用户用自然语言提需求→Agent自动采集多源数据→AI自动挖掘业务洞察→自动生成符合业务要求的多格式报告」的全链路自动化,平均可将需求响应速度从天级压缩到分钟级,释放70%以上的分析师人力成本。

AI Python 编程之道的博客 473

【STM32系统及仿真】基于STM32+蓝牙设计的智能窗帘系统__资料编号8

本项目设计并实现了一种基于STM32单片机的智能窗帘系统,集成了光敏传感器、温湿度传感器、蓝牙模块和OLED显示屏,实现了窗帘的自动调节、环境监测和远程控制功能。系统采用STM32F103C8T6作为主控制器,通过光敏传感器检测环境光强,温湿度传感器监测室内环境,蓝牙模块实现与手机APP的通信,用户可以通过APP远程控制窗帘的开合状态。系统在检测到环境光照强度或温度超出设定范围时,可自动调节窗帘的开合,以达到节能和提高舒适度的目的。

嵌入式阿齐Archie 2万+

java arc2d,java Arc2D有关问题

Java codeimport java.awt.*;import java.awt.geom.*;import javax.swing.*;public class Test73 {public static void main(String[] args) {// TODO Auto-generated method stubJFrame frame = new DrawFrame();fra...

weixin_35133814的博客 299

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HTML5 Canvas 2D arc方法使用说明

先看一下2d上下文对象中关于arc接口的定义: 1 void arc( 2 in float x, 3 in float y, 4 in float radius, 5 i

web 前端 2154

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python中怎么输入角度_python – 在Matplotlib中绘制两行之间的角度的最佳方式

您可以使用matplotlib.patches.Arc绘制相应角度测量的弧.绘制角弧:定义一个可以使用2个matplotlib.lines.Line2D对象的函数,计算角度并返回一个matplotlib.patches.Arc对象,您可以将其添加到绘图中.def get_angle_plot(line1,line2,offset = 1,color = None,origin = [0,0],le...

weixin_39990558的博客 2447

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

canvas arc()方法详解

arc方法是2D画布的一个绘制圆状态的一个方法,arc有六个参数:arc(x, y, r, sAngle, eAngle, counterclockwise);六个参数对应的意思: x,y表示圆心坐标 r  表示圆的半径 sAngle :   表示开始绘制的角度 eAngle :    表示结束绘制的角度 counterclockwise  : 表示顺时针绘制还是逆时针,false =

maoguiyou的专栏 5765

C语言Arc函数画圆弧,用Canvas的arc函数绘制圆和图形

Canvas没有circle函数来画一个圆。在Canvas绘图API中,提供了一个函数来绘制不同的弧,包括圆。arc函数可接受以下参数,具体说明参见表把角度转换为弧度arc函数使用的angle参数指的是radian(弧度)而不是degree(角度)。如果原来习惯于使用角度,那么就需要在把angle参数值传入arc函数之前将角度值转换成弧度值。可以用下面的公式来转换角度单位:Radians = π/...

weixin_29543187的博客 3688

java 圆弧_如何在Java 2D中绘制圆弧?

Arc2D是用于存储由边界矩形限定的2D弧的所有对象的抽象超,起始角度,角跨越(弧的长度),和一个闭合型(Arc2D.OPEN,Arc2D.CHORD,或Arc2D.PIE)。为了用双值构造新的弧,例如定义指定的位置,大小,角度范围和闭合类型,我们可以使用Arc2D.Doublestatic-inner类。packageorg.nhooo.example.geom;importjavax.sw...

weixin_32367173的博客 941

关于CANVAS画圆的弧度角度问题--转载自Slience

http://blog.youkuaiyun.com/u010513756/article/details/47054763 问题导入 [html] view plain copy  print? body>   canvas id="myCanvas" width="400" height="400" style="border:1px soli

mg8237672的博客 1167

ARC & MRC,这不是技术路线问题

写这个帖子是因为好多人(有经验的,没经验的)对于ARC 很陌生,所以不敢用。更有一些人道听途说了ARC的只言片语就开始下结论ARC是否适合自己。我相信要成为一名优秀的程序员,实事求是肯定是必须具备的素质。所以需要先彻底了解ARC,而且在一个项目中应用才能下决定。 另外一个目的则是给新人看,我希望减少被误导的新人数目,一个也好。 那么,什么是 ARC。对于有C++背景的人来说,A

seal82的博客 523

canvas对象arc函数的使用-遁地龙卷风

(-1)写在前面 我用的是chrome49 <canvas id="lol" height="300"></canvas> (1)详细介绍 arc函数用来显示圆的那一部分 context.arc(100,100,50,Math.PI/6,Math.PI*2,false); 1,2 参数指定圆心, 3 参数指定半径, 4 参数指定起始角度,5参数指定结束角度 6 参数为true逆时针画,false顺时针画,不传递为false a.象限分布 example1 在圆确定的情况下,显示圆.

u011927449的博客 722
上一篇: [转贴]Derby入门 —— (2)
下一篇: 一梦
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值