如何在java中检测形状的交集?

如何在java中检测形状的交集?,java,intersection,shapes,line-intersection,Java,Intersection,Shapes,Line Intersection,我想知道如何让java检测椭圆是链接到直线还是矩形,程序也应该检测它链接到的形状 绘制椭圆,同时绘制直线和矩形。Java必须检测是否有东西链接到椭圆,如果是,则通过这条线找出链接到椭圆的东西 这是我绘制形状的代码 导入java.awt.AlphaComposite; 导入java.awt.BasicStroke; 导入java.awt.BorderLayout; 导入java.awt.Color; 导入java.awt.Dimension; 导入java.awt.Graphics; 导入ja

我想知道如何让java检测椭圆是链接到直线还是矩形,程序也应该检测它链接到的形状

绘制椭圆,同时绘制直线和矩形。Java必须检测是否有东西链接到椭圆,如果是,则通过这条线找出链接到椭圆的东西

这是我绘制形状的代码

导入java.awt.AlphaComposite; 导入java.awt.BasicStroke; 导入java.awt.BorderLayout; 导入java.awt.Color; 导入java.awt.Dimension; 导入java.awt.Graphics; 导入java.awt.Graphics2D; 导入java.awt.Point; 导入java.awt.RenderingHints; 导入java.awt.Shape; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入java.awt.event.MouseAdapter; 导入java.awt.event.MouseEvent; 导入java.awt.event.MouseMotionAdapter; 导入java.awt.geom.Ellipse2D; 导入java.awt.geom.Line2D; 导入java.awt.geom.Rectangle2D; 导入java.awt.image.buffereImage; 导入java.io.File; 导入java.io.IOException; 导入java.io.OutputStream; 导入java.io.OutputStreamWriter; 导入java.io.Writer; 导入java.text.DecimalFormat; 导入java.util.ArrayList; 导入java.util.Iterator; 导入java.util.Scanner; 导入javax.imageio.imageio; 导入javax.swing.Box; 导入javax.swing.Icon; 导入javax.swing.ImageIcon; 导入javax.swing.JButton; 导入javax.swing.JColorChooser; 导入javax.swing.JComponent; 导入javax.swing.JFileChooser; 导入javax.swing.JFrame; 导入javax.swing.JLabel; 导入javax.swing.JMenu; 导入javax.swing.JMenuBar; 导入javax.swing.JMenuItem; 导入javax.swing.JOptionPane; 导入javax.swing.JPanel; 导入javax.swing.jsepator; 导入javax.swing.JSlider; 导入javax.swing.JTextField; 导入javax.swing.SwingConstants; 导入javax.swing.event.ChangeEvent; 导入javax.swing.event.ChangeListener; 导入javax.swing.filechooser.FileNameExtensionFilter; 公共课49_1扩展JFrame{ 私有静态最终长serialVersionUID=-1402742716086522L; 梅努巴; JMenu文件,退出; JMenuItem新建,打开; JC组件式绘图板; JButton lineBut、ellipseBut、rectBut、strokeBut; DecimalFormat dec=新的DecimalFormat。; //包含绘图的所有规则 图形2D图形设置; //将用于监视下一步要绘制的形状 int currentAction=1; //形状的透明度 //默认笔划和填充颜色 Color strokeColor=Color.BLACK; 公共静态无效字符串[]args{ 新课49_1; } 公共课49_1{ //定义JFrame的默认值 本标准规定了尺寸800600; 此.setTitleERD生成器; this.setDefaultCloseOperationJFrame.EXIT_ON_CLOSE; this.setJMenuBarmenubar; JMenuBar menuBar=新JMenuBar; //将菜单栏添加到框架中 setJMenuBarmenuBar; //定义并向菜单栏添加两个下拉菜单 JMenu fileMenu=新的JMenu文件; JMenu editMenu=新建JMenuEdit; JMenu dbMenu=新的JMenu数据库; JMenu ToolsMenu=新的JMenuTools; JMenu HelpMenu=新建JMenuHelp; menuBar.addfileMenu; menuBar.addedit菜单; menuBar.adddbMenu; menuBar.addToolsMenu; menuBar.addHelpMenu; //创建简单菜单项并将其添加到下拉菜单之一 jmenuitemnewaction=newjmenuitemnewproject; JMenuItem openAction=新的JMenuItemOpen文件; jMenuItemExitAction=新建JMenuItemQuit; jMenuItemCutAction=新的JMenuItemCut; JMenuItem copyAction=新建JMenuItemCopy; JMenuItem pasteAction=新的JMenuItemPaste; jMenuItemUndoAction=新的JMenuItemUndo; JMenuItem RedoAction=新的JMenuItemRedo; jMenuItemClearAction=新的JMenuItemClear; JMenuItem saveAction=新建JMenuItemSave; jMenuItemExportAction=新的JMenuItemExport; JMenuItem printAction=新的JMenuItemPrint; JMenuItem ConvertAction=新的JMenuItemConvert到表; JMenuItem ColorAction=新的JMenuItemColor选择器; jMenuItemZoomAction=新的JMenuItemZoom; JMenuItem EntityAction=新的JMenuItemEntity和属性; JMenuItem RelationshipAction=新的JMenuItemRelationship属性; JMenuItem HelpAction=新建JMenuItemHelp; jMenuItemAboutAction=新的JMenuItemAbout; fileMenu.addnewAction; fileMenu.addSeparator; fileMenu.addopenAction; fileMenu.addSeparator; fileMenu.addsaveAction; fileMenu.addSeparator; fileMenu.addexportAction; fileMenu.addSeparator; fileMenu.addprintAction; fileMenu.addSeparator; fileMenu.addexitAction; editMenu.addUndoAction; editMenu.addSeparator; editMenu.AddRedAction; editMenu.addSeparator; 电子数据交换 tMenu.addcutAction; editMenu.addSeparator; editMenu.addcopyAction; editMenu.addSeparator; editMenu.addpasteAction; editMenu.addSeparator; editMenu.addclearAction; dbMenu.addConvertAction; ToolsMenu.addColorAction; ToolsMenu.addSeparator; ToolsMenu.addZoomAction; ToolsMenu.addSeparator; ToolsMenu.addEntityAction; ToolsMenu.addSeparator; ToolsMenu.addRelationshipAction; HelpMenu.addHelpAction; HelpMenu.addSeparator; HelpMenu.addAboutAction; exitAction.AddActionListener新建ActionListener{ 公共作废actionPerformedActionEvent arg0{ }} ; ConvertAction.AddActionListener新建ActionListener{ 公共作废actionPerformedActionEvent arg0{ 新建ConvertForm.setVisibletrue; }} ; newAction.AddActionListener新建ActionListener{ 公共作废actionPerformedActionEvent arg0{ 新课49_1.setVisibletrue; } }; JPanel buttonPanel=新的JPanel; JPanel FieldPanel=新的JPanel; //可容纳所有按钮的回转箱 Box theBox=Box.createVerticalBox; Box theBoxs=Box.createVerticalBox; //通过传递 //按钮图标。 lineBut=makemebutions./src/line.png,2; ellipseBut=makemebutions./src/eliple.png,3; rectBut=makemebutions./src/rectangle.png,4; //通过传递 //按钮图标和true表示笔划颜色,false表示填充 strokeBut=makeMeColorButton./src/stroke.png,5,true; //将字段添加到框中 //盒子。但是; box.addlineBut; 框中的。addellipseBut; box.addrectBut; box.addstrokeBut; buttonPanel.addtheBox; FieldPanel.addtheBoxs; this.addbuttonPanel,BorderLayout.WEST; this.addFieldPanel,BorderLayout.EAST; buttonPanel.SetPreferredSizeNewDimension200480; FieldPanel.SetPreferredSizeNewDimension200480; //使绘图区域占据框架的其余部分 //this.addnew DrawingBorderLayout.CENTER; 最终绘图板绘图面板=新绘图板; this.adddrawPanel,BorderLayout.CENTER; this.getContentPane.setBackgroundColor.WHITE; exportAction.AddActionListener新建ActionListener{ 公共作废actionPerformedActionEvent arg0{ BuffereImage image=new BuffereImage DrawPanel.getWidth, drawPanel.getHeight,BuffereImage.TYPE_INT_ARGB; Graphics2D g=image.createGraphics; drawPanel.paintg; g、 处置; JFileChooser fileChooser=新的JFileChooser; 文件目录=新文件c:/Users/Wenda/Desktop; fileChooser.setCurrentDirectoryDirectory目录; FileNameExtensionFilter pngFilter=新FileNameExtensionFilter PNG文件*.PNG,PNG; fileChooser.addchoosablefilterpngfilter; fileChooser.setFileFilterpngFilter; int status=fileChooser.showSaveDialogLesson49\u 1.this; 如果状态==JFileChooser.APPROVE\u选项{ 试一试{ ImageIO.writeimage,png, fileChooser.getSelectedFile; JOptionPane.showMessageDialognull,图像保存到 +fileChooser.getSelectedFile.getName; }捕获异常{ 例如,打印跟踪; } } } }; //显示框架 此.setVisibletrue; } 公共JButton makemebuttonstring iconFile,final int actionNum{ JButton theBut=新JButton; 图标butIcon=新的图像图标配置文件; theBut.setIconbutIcon; theBut.addActionListener新建ActionListener{ 公共无效诉讼执行事件e{ currentAction=actionNum; } }; 返回theBut; } //根据提供的图像和 //是否定义笔划或填充 public JButton makeMeColorButtonString iconFile,final int actionNum, 最终布尔笔划{ JButton theBut=新JButton; 图标butIcon=新的图像图标配置文件; theBut.setIconbutIcon; theBut.addActionListener新建ActionListener{ 公共无效诉讼执行事件e{ 如果中风{ //JColorChooser是一个弹出窗口,允许您选择颜色 strokeColor=JColorChooser.showDialognull, 选择一个笔划,颜色为黑色; }否则{ } } }; 返回theBut; } 公共类DrawingBoard扩展JComponent{ 私有静态最终长serialVersionUID=-4431176095451940075L; //包含与一起绘制的每个形状的ArrayList //形成笔划和填充的形状 ArrayList形状=新的ArrayList; ArrayList shapeStroke=新的ArrayList; 点式绘图开始,抽屉; //监视框架绘图区域上的事件 公共绘图板{ 此.addMouseListenernew MouseAdapter{ 公共无效鼠标pressedMouseE事件{ 如果currentAction!=1{ //按下鼠标时,获取x&y位置 drawStart=新点e.getX,e.getY; 付款人=提款开始; 重新油漆; } } 公共无效MouseReleasedMouseE事件{ 如果currentAction!=1{ 形状aShape=null; 如果currentAction==2{ aShape=drawLinedrawStart.x,drawStart.y, e、 getX,e.getY; shapes.addaShape; shapeStroke.addstrokeColor; drawStart=null; 付款人=空; 重新油漆; }否则 如果currentAction==3{ aShape=drawlipsedrawstart.x,drawStart.y, e、 getX,e.getY; shapes.addaShape; shapeStroke.addstrokeColor; drawStart=null; 付款人=空; 重新油漆; 新属性form.setVisibletrue; }否则 如果currentAction==4{ //使用x&y坐标创建新矩形 aShape=drawRectangledrawStart.x,drawStart.y, e、 getX,e.getY; shapes.addaShape; shapeStroke.addstrokeColor; drawStart=null; 付款人=空; 重新油漆; 新EntityForm.setVisibletrue; } //向这些阵列列表添加形状、填充和颜色 } } }; 此.addMouseListenernew MouseAdapter{ @凌驾 公共无效鼠标单击房屋事件me{ JTextField name=新的JTextField15; super.mouseClickedme; 对于形状s:形状{ 如果s.containsme.getPoint{//检查是否在形状内单击鼠标 //我们可以只打印出对象类名 System.out.PrintLn单击a+s.getClass.getName; //或者检查正在使用嵌套if的实例处理的shape类 如果是矩形2D的实例{ //创建表 } 如果是Ellipse2D的实例{ } } } } }; this.AddMouseMotionListener新建MouseMotionAdapter{ 公共无效MousedRaggedMouse事件{ //如果这是一个画笔,让形状快速出现在屏幕上 如果currentAction==1{ int x=e.getX; int y=e.getY; 形状aShape=null; shapes.addaShape; shapeStroke.addstrokeColor; //添加透明度值 } //拖动鼠标后获取最终的x&y位置 付款人=新点e.getX,e.getY; 重新油漆; } }; } 公共空间{ //使用的类 定义要绘制的形状的步骤 图形设置=图形2d g; //抗锯齿清理锯齿线并定义渲染 //规则 graphSettings.SetRenderingHintrenderingHintrenderingHints.KEY_抗锯齿, RenderingHints.VALUE_ANTIALIAS_ON; //定义笔划的线宽 graphSettings.setStrokenew基本行程4; //创建迭代器以循环笔划和填充 迭代器strokeCounter=shapeStroke.Iterator; 对于形状s:形状{ //从颜色阵列列表中获取下一个笔划 graphSettings.setPaintstrokeCounter.next; 图形设置。绘图; } //用于绘图的导向形状 如果开始空(&D)抽屉!=空的{ //使导向形状透明 graphSettings.setCompositeAlphaComposite.getInstance AlphaComposite.SRC_超过0.40f; //将导向器形状设置为灰色,打造专业外观 graphSettings.setPaintColor.浅灰色; 形状aShape=null; 如果currentAction==2{ aShape=drawLinedrawStart.x,drawStart.y,drawEnd.x, 付款人:y; }否则 如果currentAction==3{ aShape=drawlipsedrawstart.x,drawStart.y,drawnd.x, 付款人:y; }否则 如果currentAction==4{ //使用x&y坐标创建新矩形 aShape=drawRectangledrawStart.x,drawStart.y,drawEnd.x, 付款人:y; } graphSettings.drawaShape; } } 私有矩形2D。浮点drawRectangleint x1,int y1,int x2,int y2{ //获取形状的左上角 //Math.min返回最接近0的点 int x=Math.minx1,x2; int y=Math.miny1,y2; //获取坐标和之间的差 int width=Math.absx1-x2; int height=Math.absy1-y2; 返回新矩形2D。浮动X、y、宽度、高度; } 专用椭圆E2D。浮动抽屉椭圆起点x1,整数y1,整数x2,整数y2{ int x=Math.minx1,x2; int y=Math.miny1,y2; int width=Math.absx1-x2; int height=Math.absy1-y2; 返回新的椭圆2d.Floatx,y,width,height; } 专用线条2D。浮点绘图线条int x1、int y1、int x2、int y2{ 返回新行2D.X1、y1、x2、y2; } } } 有两种情况

根据你所展示的,如果一条线与你的椭圆相连,它只连接在顶部的中心,或者它可能在一个中心的中心,我们可以看到,如果你的线与你的椭圆在一个侧面的中心相交,那么你可以把椭圆看成一个矩形。然后在java中,您可以使用 矩形线条=新矩形线条.x,线条.y,线条.width,线条.height; 矩形椭圆=新矩形椭圆.upperLeft.x,椭圆.upperLeft.y,椭圆.width,椭圆.height; 布尔值isThereAnIntersection=yourLine.intersectsellipse

对于常规方法,在处理复杂形状时,可以使用BuffereImage作为图形的缓冲区,然后在paintGraphics gmethod中显示BuffereImage。通过使用此BuffereImage绘制椭圆和直线,您可以直接检查直线的边界是否绘制在彩色像素或背景像素上,这意味着如果绘制在彩色像素上,则在该位置已经绘制了一个对象,因此您最终必须根据其位置获取该对象


一个对象是否可能链接到多个对象?只需检查对象的边界即可。假设我们有两个形状s1和s2。如果s1.maxRight>s2.minLeft和s1.maxbottom>s2.maxbottom或s1.minTop