processing判断一个点(鼠标事件)是否在三角形、圆、椭圆、矩形内之第二章(超详细鼠标交互)

第二篇更新啦!!!!

上一篇我们详细地讲了processing判断点击是否在三角形和圆内​​​​​​​,这一期我们主要讲如何判断点击在椭圆和矩形内部,喜欢就麻烦点赞加关注吧,谢谢噢,你的支持是我继续创作的动力!!!

上一期 

​​​​​​圆和三角形看这里

最新一期:直接上processing+Arduino代码,实现软硬件结合

目录

一:如何判断点击是否在椭圆内:

(一)椭圆与点的关系:

方法一:

方法二: 

(二)实现

在这里有一个易错点:

x轴——方法一代码:(表达式实现)

x轴——方法二代码:(|MF1|+|MF2|=2a实现)

y轴——方法一代码:(表达式实现)

y轴——方法二代码:(|MF1|+|MF2|=2a实现)

二、如何判断点击点是否在矩形内


强调一下噢,上一篇是重点讲解processing判断点击是否在三角形和圆内,这一篇重点讲解如何判断点击是否在椭圆和矩形内部,

话不多说,上干货:

一:如何判断点击是否在椭圆内:

我们在高中都学过椭圆的表达式:b%5E2%3D1%2C%28a%3Eb%3E0%29%3B(焦点在x轴,后面我们都是以焦点在x轴作讲解,焦点在y轴同理)

那么我们是否可以根据此表达式算出点与椭圆的关系呢?

当然可以啦,如果大家忘记椭圆的相关信息了,没关系,下面我会详细讲解,不用担心!!!

(一)椭圆与点的关系:

无非就三点:1、点在椭圆上;2、点在椭圆内;3、点在椭圆外。

方法一:

1、点在椭圆上:

把点的坐标(x,y)代入椭圆表达式,如果结果等于1,那么就在椭圆的边上

2、点在椭圆内:

把点的坐标(x,y)代入椭圆表达式,如果结果小于1,那么就在椭圆的里面。

3、点在椭圆外:

把点的坐标(x,y)代入椭圆表达式,如果结果大于1,那么就在椭圆的外面。

方法二: 

 除了用表达式,我们还可以用距离:

我们知道椭圆两个焦点F1(-c,0),F2(c,0),如果此时有椭圆上一个点M(x1,y1)那么就有:

|MF1|+|MF2|=2a

如果一个点不在椭圆上即在椭圆外或内是什么样呢?

椭圆外:

 明显当点在椭圆外:|MF1|+|MF2| > 2a

椭圆内:

  明显当点在椭圆外:|MF1|+|MF2| < 2a

综合上述,我们也可以用椭圆的定义做

(二)实现

我们又知道在processing中画椭圆与画圆是同一个函数:

ellipse(x,y,2a,2b);//y轴:ellipse(x,y,2b,2a);

那么在(一)中叙述的方法,不管是方法一还是方法二,都只需要知道点击点的坐标(mouseX,mouseY)和椭圆的,a、b/c即可,那么这个我们能不能知道呢?当然可以

由上面那个代码我们看到第一二个参数是我们椭圆的中心点,而第三四个参数就是椭圆的2a,2b,(记住是二倍窝) ,又有:a^2-b^2=c^2,那么c我们也可以直接求出来啦,当然方法一并不需要求c,所以我这里的代码就重点展示方法一,对于方法二的话,各位朋友只需要代入公式求出c,然后再像我上一篇讲的那样,用两点距离公式求线段长度,再套入公式计算比较就可以啦,非常容易实现!!!

在这里有一个易错点:

我们的表达式是基于椭圆中心点是在原点,焦点是在x轴上实现的,而processing中的坐标原点是在左上角的,所以在编写代码的时候要注意把鼠标点击的坐标减去中心点的值也就是mouseX-x(中心点坐标),mouseY-y(中心点坐标),可以理解就是将我们的抽象地认为我们已经把椭圆、鼠标挪回了原点,因为我们的a,b是一个静值,所以挪的只是鼠标点就可以了,mouseX-x(中心点坐标),mouseY-y(中心点坐标)就是一个把点击点mouse往x轴移动了x,往y轴移动了y,从而回到了相对坐标系的原点,话不多说,上代码:

x轴——方法一代码:(表达式实现)

void setup(){
  size(300,300);//300*300的画布
}
void draw() {
  fill(0,0,255);//蓝色
  ellipse(150,150,80,50);//画了一个中心点在(150,150),a=40,b=25的椭圆
}
void mouseClicked(){
  float x1=mouseX-150;//抽象挪回原点,一定要用float
  float y1=mouseY-150;
  float tuo=sq(x1/40)+sq(y1/25);//表达式计算
  println(mouseX,mouseY,tuo);//输出鼠标点击位置,及计算结果
  if(tuo<=1){//在椭圆内
    println("Inside ellipse");
  }else{//在椭圆外
      println("Outside ellipse");
    }
  
}

有我没说明白的部分请后台私信我噢,也欢迎大家找我交流学习!!!谢谢!!!

运行效果:

x轴——方法二代码:(|MF1|+|MF2|=2a实现)

这个就不如方法一简单了,首先要用公式a^2-b^2=c^2计算出c,从而确定F1,F2的坐标,再用公式gif.latex?s%3D%5Csqrt%7B%28x1-x2%29%5E2&plus;%28y1-y2%29%5E2%7D计算 |MF1| 和 |MF2| ,最后再用判断语句判断与2a的关系,这就是编程思路,当然还要注意坐标系的问题,上代码:

void setup(){
  size(300,300);
}
void draw() {
  fill(0,0,255);
  ellipse(150,150,80,50);
}
void mouseClicked(){
  float x1=mouseX-150;
  float y1=mouseY-150;
  float c=sqrt(sq(80/2)-sq(50/2));
  float MF1=sqrt(sq(x1+c)+sq(y1-0));
  float MF2=sqrt(sq(x1-c)+sq(y1-0));
  println(mouseX,mouseY,MF1,MF2,c);
  if(MF1+MF2<=80){
    println("Inside ellipse");
  }else{
      println("Outside ellipse");
    }
  
}

运行效果:

一样正常判断

 以上就是基于processing判断鼠标点击点是否在一个焦点在x轴的过程啦!!!

y轴——方法一代码:(表达式实现)

表达式:y^2/a^2+x^2/b^2=1;(a>b>0);所以就只需要换一下x,y的计算位置就好啦!!!

void setup(){
  size(300,300);
}
void draw() {
  fill(0,0,255);
  //ellipse(150,150,80,50);
  ellipse(150,150,50,80);
}
void mouseClicked(){
  float a=mouseX-150;
  float b=mouseY-150;
  //float tuo=sq(a/40)+sq(b/25);
  float tuo=sq(b/40)+sq(a/25);//表达式计算改了
  println(mouseX,mouseY,tuo);
  if(tuo<=1){
    println("Inside ellipse");
  }else{
      println("Outside ellipse");
    }
  
}

运行效果:

y轴——方法二代码:(|MF1|+|MF2|=2a实现)

void setup(){
  size(300,300);
}
void draw() {
  fill(0,0,255);
  //ellipse(150,150,80,50);
  ellipse(150,150,50,80);
}
void mouseClicked(){
  float x1=mouseX-150;
  float y1=mouseY-150;
  float c=sqrt(sq(80/2)-sq(50/2));
  float MF1=sqrt(sq(x1-0)+sq(y1+c));//只改坐标即可
  float MF2=sqrt(sq(x1-0)+sq(y1-c));
  println(mouseX,mouseY,MF1,MF2,c);
  if(MF1+MF2<=80){
    println("Inside ellipse");
  }else{
      println("Outside ellipse");
    }
  
}

运行效果:

以上就是基于processing判断鼠标点击点是否在一个焦点在y轴的过程啦!!!

 至此判断点击点是否在椭圆内部的讲解到此结束啦,有疑惑的记得私信我噢,进我主页说不定后面也有更新!!!

前调一次:想看判断一个点是否在三角形、圆内部的请看我的另一篇:http://t.csdn.cn/2gBLthttp://t.csdn.cn/2gBLt

二、如何判断点击点是否在矩形内

矩形就相对比较简单啦,不像前面介绍的那么复杂,因为矩形是一个非常规则的图形,只需要掌握其x,y坐标的范围就已经可以直接确定他的位置啦,直接上代码:

画矩形的两种方法:

rect(x, y, a, b);
quad(x1,y1,x2,y2,x3,y3,x4,y4);

说明:rect这个方法的第一二个参数是矩形左上角坐标值,a,b分别是x,y轴上的长度

quad:比较复杂,如图:

 代码:

void setup(){
  size(300,300);
}
void draw() {
  fill(255,0,0);
  rect(100, 100, 10, 100);
}
void mouseClicked(){
  if((mouseX>=100)&(mouseX<=200)&(mouseY>=100)&(mouseY<=200)){
  println("Inside rectangle");
  }else{
      println("Outside rectangle");
    }
}

运行效果:

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
以下是一个示例代码,展示如何让5个随着鼠标移动,离鼠标越远移动越快,你可以根据自己的需求进行修改: ```python class Circle: def __init__(self, x, y, r): self.x = x self.y = y self.r = r self.speed = 0.1 def move_away(self, target_x, target_y): # 计算心到目标点的距离 d = dist(self.x, self.y, target_x, target_y) # 计算需要移动的距离 move_dist = self.r + 10 - d # 计算移动的方向向量 dx = (self.x - target_x) / d dy = (self.y - target_y) / d # 根据速度和方向移动 self.x += dx * move_dist * self.speed self.y += dy * move_dist * self.speed # 限制速度的最大值 self.speed = min(0.5, self.speed * 1.1) def draw(self): ellipse(self.x, self.y, self.r * 2, self.r * 2) circles = [] num_circles = 5 for i in range(num_circles): x = random(width) y = random(height) r = random(20, 50) circles.append(Circle(x, y, r)) def setup(): size(400, 400) def draw(): background(255) for circle in circles: # 让远离鼠标 circle.move_away(mouseX, mouseY) # 绘制 circle.draw() ``` 在这个示例中,我们创建了5个对象,并将它们存储在一个列表中。在 `draw()` 函数中,我们遍历这个列表,对于每个,调用 `move_away()` 方法来让它远离鼠标,然后调用 `draw()` 方法来绘制。在 `move_away()` 方法中,我们使用 `dist()` 函数计算心和鼠标之间的距离,并根据距离计算需要移动的距离和移动的方向向量。然后根据速度和方向移动,并限制速度的最大值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你好呀zws

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值