drawrect java_java-了解Graphics 2D以及旋转,drawRect方法-程序员宅基地

技术标签: drawrect java  

出于好奇,我做了这样的事情.

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Point;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionAdapter;

import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

public class RectanglePanel extends JPanel{

private Point anchorPoint = null;

private Point intermediatePoint = null;

private Point finalPoint = null;

public RectanglePanel(){

addMouseListener(new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent me){

if(anchorPoint == null){

// first click, set anchor point

anchorPoint = me.getPoint();

}else if(finalPoint == null){

// second click, set final point

finalPoint = me.getPoint();

}else{

// third click, reset clicks, anchor point, intermediate point and final point

anchorPoint = null;

finalPoint = null;

intermediatePoint = null;

}

repaint();

}

});

addMouseMotionListener(new MouseMotionAdapter() {

@Override

public void mouseMoved(MouseEvent me){

if(anchorPoint != null && finalPoint == null){

// mouse moved

// set intermediate point if anchor point is set and final point is not set yet

intermediatePoint = me.getPoint();

repaint();

}

}

});

}

@Override

protected void paintComponent(Graphics g){

super.paintComponent(g);

if(anchorPoint != null){

Graphics2D g2d = (Graphics2D) g;

g2d.setColor(Color.red);

Point p = finalPoint != null ? finalPoint : intermediatePoint;

if(p != null && !p.equals(anchorPoint)){

// final point or intermediate point is set, and is not same as anchor point

// draw square

// calculate angle to rotate canvas

double angle = -Math.toRadians(45) + Math.atan2(p.y - anchorPoint.y, p.x - anchorPoint.x);

// width of square, calculated using distance formaula and pythagorus theorem

// distance formula: distance = sqrt((x1-x2)^2 + (y1-y2)^2)

// pythagorus for right angled triangle: c^2 = a^2 + b^2

double width = Math.sqrt(((p.x - anchorPoint.x) * (p.x - anchorPoint.x) + (p.y - anchorPoint.y) * (p.y - anchorPoint.y)) / 2.0);

// set origin to anchorpoint

g2d.translate(anchorPoint.x, anchorPoint.y);

// rotate canvas

g2d.rotate(angle);

Rectangle2D rectangle2D = new Rectangle2D.Double(0, 0, width, width);

// draw square

g2d.draw(rectangle2D);

// rotate back canvas

g2d.rotate(-angle);

// reset back origin

g2d.translate(-anchorPoint.x, -anchorPoint.y);

}else{

g2d.drawRect(anchorPoint.x, anchorPoint.y, 1, 1);

}

}

}

public static void main(String [] args){

final JFrame frame = new JFrame("Rectangle Test");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(500, 400);

frame.getContentPane().add(new RectanglePanel());

SwingUtilities.invokeLater(new Runnable() {

public void run() {

frame.setVisible(true);

}

});

}

}

您可以像这样实现,以解决您的问题.让我知道这是您要寻找的吗?

脚步:

1)计算正方形的宽度.您有一些点,它们代表正方形的相对角.这两个点之间的距离是对角线的长度.因此,考虑两个点(x1,y1)和(x2,y2),使用距离公式,对角线的长度由下式给出:

diagonal_length * diagonal_length = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)

正方形和对角线的两侧将形成直角三角形.正方形的边长相等,让正方形的边成为边,然后使用毕达哥拉斯定理:

side * side + side * side = diagonal_length * diagonal_length

解决上面的两个方程,

side = Math.sqrt(((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) / 2.0);

2)计算旋转画布的角度,因此第二个点以第一个点为原点与x轴成45度角.

3)确定第一个点的原点.

4)旋转画布,第二点与x轴成45度角,第一点为原点.这将使正方形的两个侧面落在轴上,而其他两个侧面平行于轴平行,因此可以使用图形的draw方法绘制矩形/正方形.

5)从原点开始绘制正方形,其边长如上所述计算.

6)将画布反向旋转,以使其与旋转前相同.

7)将原点重设为设置原点之前的原点.

做完了!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29894211/article/details/114076971

智能推荐

springBoot源码之servlet与reactive_servlet和reactive-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏5次。英语好的可以参考spring的官方文档:https://spring.io/reactiveReactive系统适合低延迟、高吞吐量的工作负载;Reactive Project和Spring结合,可以让开发人员搭建企业级的反应式系统,该系统是响应式的、弹性的、灵活的、消息驱动的。是Spring的reactive栈的非阻塞的基础,比如Spring WebFlux, Spring Data, 和 Spring Cloud Gateway。_servlet和reactive

svn【偷取此锁定】或【破除锁定】解锁SVN被锁定的文件的控制权-程序员宅基地

文章浏览阅读162次。现在很多项目开发都使用SVN作为馆控工具,SVN馆中的文件既可以以文件夹的方式获取,也可以通过eclipse导入。获取文件后,我们可以对某个文件锁定。 如果某个同事锁定了某个文件,而他却找不到是在哪个地方(如工程或文件夹)锁定了该文件,则我们可以通过下面的方式获取该文件的控制权。 偷锁然后再解锁操作SVN时中断锁定,文件的解锁方法1、右健选择svn -->获取锁定:..._svn偷锁

在Protel DXP中建造自己的原理图库-程序员宅基地

文章浏览阅读316次。Protel DXP是Altium公司的桌面板级电路设计系统,它集原理图设计输入、PCB设计绘制、模拟电路仿真、数字电路仿真、VHDL混合输入、FPGA设计、信号完整性分析等诸多功能于一体,是非常优秀的EDA软件.Protel DXP提供了丰富的元器件库,这些元器件库主要是集成库和PCB库.Protel DXP没有单独的原理图库,原理图符号存在于集成库中.即使这样,在使用的过程中,有时也经常遇到..._dxp 原理图生成元件库

Django-自定义过滤器_django自定义过滤器-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏5次。文章目录一、使用步骤1.创建文件2.导入注册过滤器的Library 实例一、使用步骤1.创建文件创建templatetags(必须是这个名字)文件夹在你的应用下创建templatetags文件夹如果文件夹名字不是templatetags可能会出现以下错误在templatetags文件夹下创建my_tags.py(文件名可自定义)2.导入注册过滤器的Library 实例代码如下from django import template# 下面代码会直接使用register_django自定义过滤器

17. 【C语言】有一个学生结构体,其数据成员有: 学号, 姓名, 3 门课程分数。从键盘上输入 5 个学生 的信息,按要求输出(5_task)_用结构体输入5个学生信息在输出-程序员宅基地

文章浏览阅读1.5w次,点赞20次,收藏97次。问题描述:有一个学生结构体,其数据成员有: 学号, 姓名, 3 门课程分数。从键盘上输入 5 个学生的信息,按如下要求输出:(1) 按照学号递增输出全部学生信息,每个学生的信息一行。(格式: 学号 姓名 分数1 分数 2 分数 3 总分)(2) 输出每门课程最高分的学生的信息(3) 输出每门课程的平均分(4) 按照总分输出学生排名算法思想:(1)第1问要求按学号递增输出信息,在不确定..._用结构体输入5个学生信息在输出

ASP.NET MVC 入门-程序员宅基地

文章浏览阅读340次。ASP.NET MVC 入门 (Learning ASP.NET MVC)传统的WebForm发展到如今出现不少的缺陷, 比如为了解决Http的无状态WebForm模式使用了ViewsState来保存客户端和服务端数据,而过量使用则会造成页面臃肿不堪。大量服务端控件的出现使得CSS样式难以控制且不如直接使用html便捷。关于页面生命周期的事件处理代码的底层实现机制非常复杂难以完全掌握、可测试性..._@foreach(var person in model)

随便推点

JAVA编程思想--多态_多态编程思想-程序员宅基地

文章浏览阅读220次。多态:消除类型之间的耦合关系(分离做什么和怎么做),基于继承的向上转型功能,允许同一种类型同一行为有不同的表现。动态绑定使得多态中的基类对象可以正确执行相应的导出类对象方法。多态使得扩展新类型和扩展基类不会对已有代码(调用基类方法的代码)产生影响。它可以让程序员“将改变的事物与不变的事物分离开”。_多态编程思想

操作系统研究的“奥斯卡” 首次独归亚州!解读SOSP 2023最佳论文 TreeSLS:基于单级存储的全系统持久微内核-程序员宅基地

文章浏览阅读903次,点赞21次,收藏17次。SOSP’23最佳论文TreeSLS是一种基于持久内存(NVM)实现单级存储(single-level store, SLS)、支持全系统持久性的微内核。TreeSLS是上海交大陈海波教授团队的最新佳作,是自1967年首届SOSP召开以来首篇由亚洲研究人员独立获得的最佳论文。本文将带您深入了解TreeSLS的研究背景、关键技术、评估结果和研究贡献,以及作者在论文问题定位方面的技巧。

iOS7下获取内付费的receipt及receipt样例_苹果 receipt 怎么来的-程序员宅基地

文章浏览阅读5.6k次。iOS7下获取内付费的receipt苹果receipt样例_苹果 receipt 怎么来的

tomcat常出现的几种错误总结_状态报告 消息 请求的资源[/denglu.html]不可用 描述 源服务器未能找到目标资源的-程序员宅基地

文章浏览阅读3.5k次。tomcat常见的问题总结HTTP状态 404 - 未找到类型 状态报告消息 请求的资源[/]不可用描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。Apache Tomcat/9.0.381.tomcat环境变量的配置(官方原稿)(3.1) Set CATALINA_HOME (required) and CATALINA_BASE (optional)The CATALINA_HOME environment variable should be set t_状态报告 消息 请求的资源[/denglu.html]不可用 描述 源服务器未能找到目标资源的

Oracle使用split和splitstr函数批量分隔字符串_oracle select rownum as item,column_value as-程序员宅基地

文章浏览阅读3.5k次。转载自http://www.cr173.com/html/18046_1.html最近项目中有很多需要做批量操作的需求,客户端把一组逗号分隔的ID字符串传给数据库,存储过程就需要把它们分割,然后逐个处理。以往的处理方式有如下几种:1、在存储过程内写循环,逐个分析字符串中的ID,然后逐个处理。缺点:循环一次处理一个,如果每次判断都很多,效率将很受影响。适合每次处理要做单独判断_oracle select rownum as item,column_value as

【Android】android中面试官常问的如何加分割线_android中toolbar中加个分割线-程序员宅基地

文章浏览阅读403次。我在面试的时候被问到怎么在项目中加分割线(ListView,GridView,RecyclerView这样自带分割线的组件不算),其实方法很简单,用一个TextView就足够了,水平的分割线就把高度设为1dp,长度设为match_parent;若是垂直的分割线就把长度设为1dp,宽度设为match_parent就OK了,_android中toolbar中加个分割线

推荐文章

热门文章

相关标签