Android计算点击坐标是否在圆内和椭圆内

最近工作需要,顺带学了波数学。

要判断点是否在圆内,可以使用圆的几何性质:如果点的坐标(x, y)满足(x - 圆心x)^2 + (y - 圆心y)^2 < 半径^2,则该点在圆内。

计算点击坐标是否在圆内

// 圆的半径
float radius =circleView.getWidth() / 2;
// 按下的坐标
float touchX = event.getX();
float touchY = event.getY();

float distanceX = Math.abs(touchX - radius);
float distanceY = Math.abs(touchY - radius);
//是否在圆内
if ((distanceX * distanceX + distanceY * distanceY) > radius * radius) {
    // 在圆外
    return false;
} else {
	// 在圆内
    return true;
}

计算点击坐标是否在椭圆内

在Android中,你可以使用椭圆的标准方程来判断一个点是否在椭圆内部。椭圆的标准方程如下:
其中,(h, k) 是椭圆的中心点,a 和 b 分别是椭圆的长轴和短轴。
如果一个点 (x, y) 满足这个方程,那么这个点就在椭圆内部。如果不满足,那么这个点就在椭圆外部。

float radiusX = mOvalWidth / 2f;
float radiusY = mOvalHeight / 2f;
// 椭圆的中心点 centerX  centerY
float centerX = mOvalWidth / 2f;
float centerY = mOvalHeight / 2f;
float touchX = event.getX();
float touchY = event.getY();
//是否在圆内  因为是裁剪居中的椭圆,所以touchX需要平移到对应位置
if (!isPointInEllipse(touchX , touchY, centerX, centerY, radiusX, radiusY)) {
	// 在圆外
	return false;
}else{
	// 在圆内
	return true;
}


// 判断点(x, y)是否在椭圆内
public boolean isPointInEllipse(float x, float y, float centerX, float centerY, float radiusX, float radiusY) {
	// 计算点到椭圆中心的距离的平方
	float distanceSquared = (x - centerX) * (x - centerX) / (radiusX * radiusX) + (y - centerY) * (y - centerY) / (radiusY * radiusY);
	// 判断点到椭圆中心的距离的平方是否小于或等于1,即半径的平方。
	// 注意:这里不是开方,因为计算距离的平方比计算距离本身更高效。
	return distanceSquared <= 1;
}

因为显示在界面上的效果,实际上只是椭圆的一部分。所以椭圆整体是大于手机显示的。
在计算touchX、touchY点的时候,需要根据你们实际显示的区域,去做对应的平移,使点击的Touch值,是点击在椭圆上真实的touch值,而不是根据当前屏幕坐标按下的touch值。

float radiusX = mOvalWidth / 2f;
float radiusY = mOvalHeight / 2f;
// 椭圆的中心点 centerX  centerY
float centerX = mOvalWidth / 2f;
float centerY = mOvalHeight / 2f;
float touchX = event.getX();
float touchY = event.getY();
// 因为椭圆是裁剪显示的,需要把点击X换算成正确的点击坐标。 transX是计算touchX应该相对于椭圆的真实的touch值
float transX = (mOvalWidth - mScreenWidth) / 2f;
//是否在圆内  因为是裁剪居中的椭圆,所以touchX需要平移到对应位置
if (!isPointInEllipse(touchX + transX, touchY, centerX, centerY, radiusX, radiusY)) {
	// 在圆外
	return false;
}


// 判断点(x, y)是否在椭圆内
public boolean isPointInEllipse(float x, float y, float centerX, float centerY, float radiusX, float radiusY) {
	// 计算点到椭圆中心的距离的平方
	float distanceSquared = (x - centerX) * (x - centerX) / (radiusX * radiusX) + (y - centerY) * (y - centerY) / (radiusY * radiusY);
	// 判断点到椭圆中心的距离的平方是否小于或等于1,即半径的平方。
	// 注意:这里不是开方,因为计算距离的平方比计算距离本身更高效。
	return distanceSquared <= 1;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值