碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞

一,原理介绍

这回有点复杂,不过看懂了还是很好理解的。当然,我不敢保证这种算法在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我。

我们首先来建立一个以圆心为原点的坐标系:

然后要检测碰撞就只有两种情况了。

情况一,矩形全部都在一个象限内,如图:

当然,图中只是举个例子,不一定是只在第二象限,任何一个象限都行,只要是矩形全在该象限。

这种情况比较好解决,首先,我们计算出矩形每个角的坐标,然后用勾股定律依次算出这个角到圆心的距离是否小于或者等于半径。设这个角与圆心横坐标之差为d1,纵坐标之差为d2,半径为r,公式表达如下:

如果有一个角满足要求说明产生碰撞,返回true。

但是有朋友懵了,怎么判断矩形是不是在一个象限内呢?很简单,只要判断这个矩形左上角和右下角是否在同一个象限内就可以了。于是我们得写个函数来实现判断某两个角是否在同一象限。

函数代码如下:

[javascript] view plaincopy

  1. function isSameQuadrant(cood,objA,objB){
  2. var coodX = cood.x;
  3. var coodY = cood.y;
  4. var xoA = objA.x
  5. ,yoA = objA.y
  6. ,xoB = objB.x
  7. ,yoB = objB.y;
  8. if(xoA-coodX>0 && xoB-coodX>0){
  9. if((yoA-coodY>0 && yoB-coodY>0) || (yoA-coodY<0 && yoB-coodY<0)){
  10. return true;
  11. }
  12. return false;
  13. }else if(xoA-coodX<0 && xoB-coodX<0){
  14. if((yoA-coodY>0 && yoB-coodY>0) || (yoA-coodY<0 && yoB-coodY<0)){
  15. return true;
  16. }
  17. return false;
  18. }else{
  19. return false;
  20. }
  21. }

这个函数原本是准备写到lufylegend中LMath静态类中的,参数原本是LPoint对象,但是这里可以用json,因为LPoint里的x,y属性可以写到json里,函数也就同样取得出值了。函数参数介绍:[cood创建的坐标系原点坐标, objA第一个点坐标, objB第二个点坐标] 这几个参数均为json对象,格式为:

[javascript] view plaincopy

  1. {x:点的x坐标, y:点的y坐标}

函数中的代码还是很好理解的,就是判断一下两个点的x坐标都分别减去原点x坐标,看得出的数正负符号是否相同,然后又用同样的办法算出y轴上的符号是否相同,如果都相同就在同一象限。

有了这个函数,剩下得就好办了,直接代入开头给出的公式进行计算即可。

情况二,矩形跨度两个象限或者两个象限以上

这种情况更好办,我们就可以直接把圆看作一个边长为2r正方形,然后用矩形碰撞算法检测正方形和矩形的碰撞,如下图所示:

矩形碰撞的算法是什么呢?很easy,如图:

如果要横向判断碰撞的话,判断(x1-x2)的绝对值是否小于或者等于w1/2+w2/2,如果是则横向则有碰撞。纵向判断是一样的,判断(y1-y2)的绝对值是否小于或等于h1/2+h2/2即可。

有了这些算法,我们就可以实现情况2了。

二,Javascript版算法&测试代码

先上代码吧:

[javascript] view plaincopy

  1. function hitTestRectArc(rectObj,arcObj,rectVec,arcR){
  2. var rw = rectObj.getWidth()
  3. ,rh = rectObj.getHeight()
  4. ,ar = arcObj.getWidth()*0.5
  5. ,rx = rectObj.x
  6. ,ry = rectObj.y
  7. ,ax = arcObj.x
  8. ,ay = arcObj.y;
  9. if(typeof rectVec != UNDEFINED){
  10. rx += (rw - rectVec[0])*0.5;
  11. ry += (rh - rectVec[1])*0.5;
  12. rw = rectVec[0];
  13. rh = rectVec[1];
  14. }
  15. if(typeof arcR != UNDEFINED){
  16. ax += (ar - arcR);
  17. ay += (ar - arcR);
  18. ar = arcR;
  19. }
  20. var rcx = rx+rw*0.5,rcy = ry+rh*0.5;
  21. var rltx = rx
  22. ,rlty = ry
  23. ,rlbx = rx
  24. ,rlby = ry+rh
  25. ,rrtx = rx+rw
  26. ,rrty = ry
  27. ,rrbx = rx+rw
  28. ,rrby = ry+rh;
  29. if(
  30. isSameQuadrant(
  31. {x:ax,y:ay},
  32. {x:rltx,y:rlty},
  33. {x:rrbx,y:rrby}
  34. )
  35. ){
  36. var dX1 = Math.abs(ax-rltx),dY1 = Math.abs(ay-rlty);
  37. var dX2 = Math.abs(ax-rlbx),dY2 = Math.abs(ay-rlby);
  38. var dX3 = Math.abs(ax-rrtx),dY3 = Math.abs(ay-rrty);
  39. var dX4 = Math.abs(ax-rrbx),dY4 = Math.abs(ay-rrby);
  40. if(
  41. (((dX1*dX1) + (dY1*dY1)) <= (ar*ar))
  42. ||(((dX2*dX2) + (dY2*dY2)) <= (ar*ar))
  43. ||(((dX3*dX3) + (dY3*dY3)) <= (ar*ar))
  44. ||(((dX4*dX4) + (dY4*dY4)) <= (ar*ar))
  45. ){
  46. return true;
  47. }
  48. return false;
  49. }else{
  50. var result = false;
  51. var squareX = ax
  52. ,squareY = ay
  53. ,squareW = ar*2
  54. ,squareH = squareW;
  55. if(
  56. (Math.abs(squareX-rcx) <= (squareW+rw)*0.5)
  57. &&(Math.abs(squareY-rcy) <= (squareH+rh)*0.5)
  58. ){
  59. result = true;
  60. }
  61. return result;
  62. }
  63. }

由于是为lufylegend设计的函数,所以参数为 [ rectObj矩形对象(LSprite或者LShape对象), arcObj圆形对象(LSprite或者LShape对象), rectVec矩形规定大小(可不填), arcR圆形半径(可不填)] 当然,或许些朋友不懂这几行代码:

[javascript] view plaincopy

  1. var rw = rectObj.getWidth()
  2. ,rh = rectObj.getHeight()
  3. ,ar = arcObj.getWidth()*0.5
  4. ,rx = rectObj.x
  5. ,ry = rectObj.y
  6. ,ax = arcObj.x
  7. ,ay = arcObj.y;

好吧,我告诉你,这里用到的是lufylegend中LSprite和LShape,这两个类有x、y属性,还有获取宽度和高度的getWidth()和getHeight(),这里看不懂没关系,你知道是取高度和宽度还有x,y坐标的就行了。当然你要深究,那就看看lufylegend.js的API文档吧:http://lufylegend.com/lufylegend/api ,以下测试代码也用到了lufylegend.js,据说这个引擎是个不错的引擎,想了解的同学,去官方网站看看吧:http://lufylegend.com/lufylegend/ 或者看看我的文章,大多数是讲解有关lufylegend开发的。

示例代码:

[javascript] view plaincopy

  1. init(50,"mylegend",500,250,main);
  2. function main(){
  3. LGlobal.setDebug(true);
  4. var back = new LSprite();
  5. back.graphics.drawRect(5,"green",[0,0,LStage.width,LStage.height],true,"lightblue");
  6. addChild(back);
  7. var cObj = new LSprite();
  8. cObj.x = 200;
  9. cObj.y = 120;
  10. cObj.graphics.drawArc(0,"",[0,0,50,0,2*Math.PI],true,"red");
  11. back.addChild(cObj);
  12. var rObj = new LSprite();
  13. rObj.x = 250;
  14. rObj.y = 70;
  15. rObj.alpha = 0.8;
  16. rObj.graphics.drawRect(0,"",[0,0,100,100],true,"green");
  17. back.addChild(rObj);
  18. trace(hitTestRectArc(rObj,cObj));
  19. back.addEventListener(LMouseEvent.MOUSE_DOWN,function(e){
  20. rObj.x = e.offsetX-rObj.getWidth()*0.5;
  21. rObj.y = e.offsetY-rObj.getHeight()*0.5;
  22. trace(hitTestRectArc(rObj,cObj));
  23. });
  24. }

测试链接:http://www.cnblogs.com/yorhom/articles/hitTestRectArc.html

三,C++版

C++版我用的是Qt,所以大家运行要在Qt creator里编译运行。

HitTestAlg.h里的代码:

[cpp] view plaincopy

  1. #ifndef HITTESTALG_H
  2. #define HITTESTALG_H
  3. #include <math.h>
  4. #include <QPoint>
  5. #include <QRect>
  6. class CMath
  7. {
  8. public:
  9. static int pow(int base, int powerOf)
  10. {
  11. return (int)::pow((double)base, (double)powerOf);
  12. }
  13. static int sqrt(int n)
  14. {
  15. return (int)::sqrt((double)n);
  16. }
  17. static int abs(int n)
  18. {
  19. n = n < 0 ? -n : n;
  20. return n;
  21. }
  22. static int distance(const QPoint& pt1, const QPoint& pt2)
  23. {
  24. return CMath::sqrt(CMath::pow(CMath::abs(pt1.x() - pt2.x()), 2) + CMath::pow(CMath::abs(pt1.y() - pt2.y()), 2));
  25. }
  26. };
  27. class CArc
  28. {
  29. protected:
  30. int m_nRadius;
  31. QPoint  m_ptCenter;
  32. public:
  33. CArc() : m_nRadius(0), m_ptCenter(0, 0){}
  34. CArc(const CArc& arc) : m_nRadius(arc.radius()), m_ptCenter(arc.center()){}
  35. CArc(int radius, QPoint center) : m_nRadius(radius), m_ptCenter(center){}
  36. CArc(int radius, int centerX, int centerY) : m_nRadius(radius), m_ptCenter(centerX, centerY){}
  37. ~CArc(){}
  38. void setRadius(int radius){m_nRadius = radius;}
  39. int radius() const {return m_nRadius;}
  40. void setCenter(const QPoint& center){m_ptCenter = center;}
  41. void setCenter(int centerX, int centerY){m_ptCenter = QPoint(centerX, centerY);}
  42. QPoint center() const {return m_ptCenter;}
  43. QRect rect() const {return QRect(center().x() - radius(), center().y() - radius(), 2 * radius(), 2 * radius());}
  44. };
  45. class CHitTestAlg
  46. {
  47. protected:
  48. QRect   m_rtRect;
  49. CArc    m_arArc;
  50. protected:
  51. bool locatedSameQuadrant() const
  52. {
  53. bool bRes = false;
  54. int nRectLeft = m_rtRect.left(), nRectTop = m_rtRect.top(), nRectRight = m_rtRect.right(), nRectBottom = m_rtRect.bottom();
  55. int nArcCenterX = m_arArc.center().x(), nArcCenterY = m_arArc.center().y();
  56. if((nRectLeft - nArcCenterX >= 0 && nRectRight - nArcCenterX >= 0 && nRectTop - nArcCenterY <= 0 && nRectBottom - nArcCenterY <= 0)
  57. || (nRectLeft - nArcCenterX <= 0 && nRectRight - nArcCenterX <= 0 && nRectTop - nArcCenterY <= 0 && nRectBottom - nArcCenterY <= 0)
  58. || (nRectLeft - nArcCenterX <= 0 && nRectRight - nArcCenterX <= 0 && nRectTop - nArcCenterY >= 0 && nRectBottom - nArcCenterY >= 0)
  59. || (nRectLeft - nArcCenterX >= 0 && nRectRight - nArcCenterX >= 0 && nRectTop - nArcCenterY >= 0 && nRectBottom - nArcCenterY >= 0)
  60. ){
  61. bRes = true;
  62. }
  63. return bRes;
  64. }
  65. bool hitTestRect() const
  66. {
  67. QRect rtArc = m_arArc.rect();
  68. bool bRes = false;
  69. if(CMath::abs(m_rtRect.center().x() - rtArc.center().x()) <= CMath::abs((m_rtRect.width() + rtArc.width()) / 2)
  70. && CMath::abs(m_rtRect.center().y() - rtArc.center().y()) <= CMath::abs((m_rtRect.height() + rtArc.height()) / 2)
  71. ){
  72. bRes = true;
  73. }
  74. return bRes;
  75. }
  76. bool hitTestAngleArc() const
  77. {
  78. bool bRes = false;
  79. QPoint ptRectTopLeft = m_rtRect.topLeft(), ptRectTopRight = m_rtRect.topRight()
  80. , ptRectBottomLeft = m_rtRect.bottomLeft(), ptRectBottomRight = m_rtRect.bottomRight()
  81. , ptArcCenter = m_arArc.center();
  82. int nArcRadius = m_arArc.radius();
  83. if(CMath::distance(ptRectTopLeft, ptArcCenter) <= nArcRadius
  84. || CMath::distance(ptRectTopRight, ptArcCenter) <= nArcRadius
  85. || CMath::distance(ptRectBottomLeft, ptArcCenter) <= nArcRadius
  86. || CMath::distance(ptRectBottomRight, ptArcCenter) <= nArcRadius
  87. ){
  88. bRes = true;
  89. }
  90. return bRes;
  91. }
  92. public:
  93. CHitTestAlg(const QRect& rect, const CArc& arc) : m_rtRect(rect), m_arArc(arc){}
  94. ~CHitTestAlg(){}
  95. bool hitTest() const
  96. {
  97. bool bRes = false;
  98. if(locatedSameQuadrant()){
  99. bRes = hitTestAngleArc();
  100. }else{
  101. bRes = hitTestRect();
  102. }
  103. return bRes;
  104. }
  105. };
  106. #endif // HITTESTALG_H

mainwindow.h里的代码:

[cpp] view plaincopy

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QWidget>
  4. #include "HitTestAlg.h"
  5. class MainWindow : public QWidget
  6. {
  7. Q_OBJECT
  8. protected:
  9. QRect       m_rtRect;
  10. CArc        m_arArc;
  11. bool        m_bHit;
  12. protected:
  13. virtual void mouseReleaseEvent(QMouseEvent *mouseEvent);
  14. virtual void paintEvent(QPaintEvent *paintEvent);
  15. public:
  16. MainWindow(QWidget *parent = 0);
  17. ~MainWindow();
  18. };
  19. #endif // MAINWINDOW_H

mainwindow.cpp里的代码:

[cpp] view plaincopy

  1. #include <QDebug>
  2. #include <QMouseEvent>
  3. #include <QBrush>
  4. #include <QPainter>
  5. #include "mainwindow.h"
  6. MainWindow::MainWindow(QWidget *parent)
  7. : QWidget(parent)
  8. , m_rtRect(0, 0, 100, 50)
  9. , m_arArc(50, 200, 200)
  10. , m_bHit(false)
  11. {
  12. QWidget::showMaximized();
  13. }
  14. MainWindow::~MainWindow()
  15. {
  16. }
  17. void MainWindow::mouseReleaseEvent(QMouseEvent *mouseEvent)
  18. {
  19. if(mouseEvent){
  20. QPoint ptPos = mouseEvent->pos();
  21. QRect rtRect;
  22. rtRect.setX(ptPos.x() - m_rtRect.width() / 2);
  23. rtRect.setY(ptPos.y() - m_rtRect.height() / 2);
  24. rtRect.setWidth(m_rtRect.width());
  25. rtRect.setHeight(m_rtRect.height());
  26. m_rtRect = rtRect;
  27. m_bHit = CHitTestAlg(m_rtRect, m_arArc).hitTest();
  28. QWidget::update();
  29. }
  30. }
  31. void MainWindow::paintEvent(QPaintEvent *paintEvent)
  32. {
  33. Q_UNUSED(paintEvent)
  34. QPainter xPainter(this);
  35. {
  36. xPainter.save();
  37. QBrush xBrush; xBrush.setColor(Qt::red); xBrush.setStyle(Qt::SolidPattern);
  38. QPen xPen; xPen.setColor(Qt::black); xPen.setStyle(Qt::SolidLine);
  39. xPainter.setBrush(xBrush);
  40. xPainter.setPen(xPen);
  41. xPainter.drawEllipse(m_arArc.center(), m_arArc.radius(), m_arArc.radius());
  42. xPainter.restore();
  43. }
  44. {
  45. xPainter.save();
  46. QBrush xBrush; xBrush.setColor(Qt::darkGreen); xBrush.setStyle(Qt::SolidPattern);
  47. QPen xPen; xPen.setColor(Qt::black); xPen.setStyle(Qt::SolidLine);
  48. xPainter.setBrush(xBrush);
  49. xPainter.setPen(xPen);
  50. xPainter.drawRect(m_rtRect);
  51. xPainter.restore();
  52. }
  53. {
  54. xPainter.save();
  55. QString sContent = QString("Hit Test: %1").arg(m_bHit ? "true" : "false");
  56. QFont ftFont("Tahoma", 12, QFont::DemiBold, true);
  57. xPainter.setFont(ftFont);
  58. xPainter.drawText(20, m_arArc.rect().bottom() + 30, sContent);
  59. xPainter.restore();
  60. }
  61. }

main.cpp里的代码:

[cpp] view plaincopy

  1. #include <QApplication>
  2. #include "mainwindow.h"
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. MainWindow w;
  7. w.show();
  8. return a.exec();
  9. }

原理和js版是一样的,就不多解释了,在下面我会放出所有代码。C++版运行demo如下:


Qt做的界面感觉还是不错的,哈哈~~

点和矩形碰撞

[java] view plaincopy

  1. /**
  2. *
  3. * @param x1 点
  4. * @param y1 点
  5. * @param x2 矩形view x
  6. * @param y2 矩形view y
  7. * @param w  矩形view 宽
  8. * @param h  矩形view 高
  9. * @return
  10. */
  11. public static boolean isCollsion(int x1, int y1, int x2, int y2, int w, int h) {
  12. if (x1 >= x2 && x1 <= x2 + w && y1 >= y2 && y1 <= y2 + h) {
  13. return true;
  14. }
  15. return false;
  16. }

矩形碰撞

[java] view plaincopy

  1. /**
  2. * 检测两个矩形是否碰撞
  3. * @return
  4. */
  5. public boolean isCollsionWithRect(int x1, int y1, int w1, int h1,
  6. int x2,int y2, int w2, int h2) {
  7. if (x1 >= x2 && x1 >= x2 + w2) {
  8. return false;
  9. } else if (x1 <= x2 && x1 + w1 <= x2) {
  10. return false;
  11. } else if (y1 >= y2 && y1 >= y2 + h2) {
  12. return false;
  13. } else if (y1 <= y2 && y1 + h1 <= y2) {
  14. return false;
  15. }
  16. return true;
  17. }

点(x1,x2) , 圆心(x2,y2) ,半径r

[java] view plaincopy

  1. if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r) {
  2. // 如果点和圆心距离小于或等于半径则认为发生碰撞
  3. return true;
  4. }

圆和圆

[java] view plaincopy

    1. /**
    2. * 圆形碰撞
    3. *
    4. * @param x1
    5. *            圆形1的圆心X坐标
    6. * @param y1
    7. *            圆形2的圆心X坐标
    8. * @param x2
    9. *            圆形1的圆心Y坐标
    10. * @param y2
    11. *            圆形2的圆心Y坐标
    12. * @param r1
    13. *            圆形1的半径
    14. * @param r2
    15. *            圆形2的半径
    16. * @return
    17. */
    18. private boolean isCollisionWithCircle(int x1, int y1, int x2, int y2,
    19. int r1, int r2) {
    20. // Math.sqrt:开平方
    21. // Math.pow(double x, double y): X的Y次方
    22. //直角坐标系,依点1和点2做平行线,|x1-x2|为横向直角边,|y1-y2|为纵向直角边 依勾股定理 c^2=a^2+b^2
    23. if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r1 + r2) {
    24. // 如果两圆的圆心距小于或等于两圆半径和则认为发生碰撞
    25. return true;
    26. }
    27. return false;
    28. }
时间: 2024-08-27 05:30:24

碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞的相关文章

Cocos2d-x教程(34)-三维物体OBB碰撞检测算法

欢迎加入Cocos2d-x 交流群:193411763 转载时请注明原文出处 :http://blog.csdn.net/u012945598/article/details/39665911 ---------------------------------------------------------------------------------------------------------------------------------------- 在上一篇文章中讲解了AABB包围

分享一位国外大牛写的不规则物体像素级碰撞检测算法及详解

最近在做一个有关投篮的小游戏,需要用到像素级碰撞检测,as3自带的hitTestObject显然无法满足需要.网上搜寻了一下,在9ria挖坟挖到两篇好文章: 分享一个超高效的不规则物体碰撞检测的类~~ [Lii]超高效的不规则物体碰撞检测<效率优化> 第一篇文章介绍了一位国外大牛写的不规则物体像素级碰撞检测算法,原理是用bitmap绘制两对象不透明区域,利用混合模式计算出两对象的相交区域. 第二篇文章则在该算法的基础上进行了效率的优化,原理是判断出两对象发生hitTestObject碰撞后,将

圆形和矩形的碰撞检测

首先来说明一下核心思想 无非是三种状态: 1.圆心在矩形中 2.圆心在矩形外,但在其某一边的侧面 3.圆心在矩形外.不再某一边的侧面 圆心在矩形中的情况十分好处理,这里就不说了. 下面来说一下2.3情况的核心应对思路: 首先,拿到矩形的四个顶点. 算出圆心到四个顶点分别的距离. 给距离从小到大排一下序. 取其中两个最小距离的点,求出圆心到这两点之间直线(或延长线)上最短距离的那个点. 重点来了: 这时候要看这个点是在两点之间,还是在这条直线的延长线上.如果是之间,就是情况2.再延长线上就是3.

圆形与矩形的碰撞检测--Mr.Ember

圆形与矩形的碰撞检测--Mr.Ember 已知:圆形半径和坐标* 矩形四个点坐标* 判断是否相交 先去找出矩形上离圆心最近的点,判断该点的距离是否小于圆半径,若小于半径,则为碰撞. let closestPoint = {x:0, y:0}; 约定圆形和矩形的类: //圆形 function Circle(x,y,r) { this.r = r; this.x = x; this.y = y; } //矩形 function Rect(ul,ur,dl,dr) { this.x = ul.x;

【LeetCode-面试算法经典-Java实现】【223-Rectangle Area(矩形区域)】

[223-Rectangle Area(矩形区域)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined by its bottom left corner and top right corner

基于Cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法

基于Cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=1577

在平面内,已知一个矩形的四个角坐标,将矩形绕中心点转动一个角度,求旋转后的角坐标.

在平面内,已知一个矩形的四个角坐标,将矩形绕中心点转动一个角度,求旋转后的角坐标.也就是已知半径,求每个点旋转后的坐标. 把旋转前和旋转后的点加上中心点看成一个等腰三角形就好解决了,不用扇形公式,而是用三角形公式.假设矩形的左上角为(left, top),右下角为(right, bottom),则矩形上任意点(x0, y0)绕其中心(xcenter,ycenter)逆时针旋转angle角度后,新的坐标位置(x′, y′)的计算公式为: xcenter = (right - left + 1) /

Canvas---Canvas版画图、圆角矩形、圆形、矩形、图形填充、mvc模式重新整合代码版

 使用Canvas实现画图程序.(转载注明出处与作者啊) 本次主要更新了一下功能: 新添加图形:矩形,圆形,圆角矩形 实现了描边颜色与填充颜色的选择 使用类似mvc的模式重新整理了代码. M层: 特殊图形的路径规划代码组成,只包含路径规划,无样式设计. V层:设计样式,调用路径规划代码,实际绘制图案.在这里完成填充.描边. C层:判断选择框内容,调用不同的实际绘制代码 其他:事件处理与辅助计算函数等 不足:感觉代码结构还是不够好,果然是我没用面向对象么? 下面是效果图: 下面是源代码: ①本

己知矩形两对角点坐标,计算矩形区域内所有坐标

时不时要用到求坐标,原来写过又忘了,重写一次备忘 private string getAllPoint(Point p1, Point p2)        {            string info = "";            int minNumX = 0;            int minNumY = 0;            for (int i = 0; i < Math.Abs(p2.X - p1.X) + 1; i++)            {