javascript - 将画布中的圆点与用户在画布中绘制的图形进行比较
问题描述
我必须制作一个从canvas中的圆圈开始的代码,用户可以在其上绘制并将正确圆圈的点与用户在顶部绘制的点进行比较。从而推断出用户失败或成功的百分比。
这就是我保持正确圆的坐标的方式。
var centerX=200;
var centerY=200;
var radius=70;
// array save circlePoints
var points=[];
for(var degree=0;degree<360;degree++){
var radians = degree * Math.PI/180;
var x = centerX + radius * Math.cos(radians);
var y = centerY + radius * Math.sin(radians);
points.push({x:x,y:y});
}
这就是用户在画布上绘制的方式,我保存了这个坐标:
function findxy(res, e) {
if (res == 'down') {
prevX = currX;
prevY = currY;
currX = e.clientX - canvas.offsetLeft;
currY = e.clientY - canvas.offsetTop;
arrayCoordenadas.push({currX:currX,currY:currY});
flag = true;
dot_flag = true;
if (dot_flag) {
ctx.beginPath();
ctx.fillStyle = x;
ctx.fillRect(currX, currY, 2, 2);
ctx.closePath();
dot_flag = false;
}
}
if (res == 'up' || res == "out") {
flag = false;
}
if (res == 'move') {
if (flag) {
prevX = currX;
prevY = currY;
currX = e.clientX - canvas.offsetLeft;
currY = e.clientY - canvas.offsetTop;
arrayCoordenadas.push({currX:currX,currY:currY});
draw();
}
}
}
我不知道我在绘制时保存坐标的方式是否正确,也不知道如何比较两个数组。
解决方案
我建议查找坐标的更简单方法是将初始圆值存储在一个对象中,其中每个值都有一个与之关联x
的值数组。y
此处的示例显示了如何检查每个用户点以查看它是否与圆上的点匹配。
var centerX=200;
var centerY=200;
var radius=70;
// array save circlePoints
//set to object instead, for each X value store an array of Y values that correspond.
//this makes checking a user point easier
var points = {};
for(var degree=0;degree<360;degree++){
var radians = degree * Math.PI/180;
var x = centerX + radius * Math.cos(radians);
var y = centerY + radius * Math.sin(radians);
if(!points[x]) points[x] = [] //if the array for point x doesn't exist, create it
points[x].push(y) //push the y value into the array for the x value
}
function isPointOnCircle(x,y){
return !!points[x] && points[x].indexOf(y) > -1
}
var userPoints = [
[270,200],
[130,50],
[200,270],
[100,200]
]
userPoints.forEach(point => {
console.log(isPointOnCircle(...point))
})
推荐阅读
- android - 搜索视图显示在输入 3 个字符后未找到记录
- javascript - 如何在 Django 视图中访问本地存储中的数据?
- python - 创建用户个人资料时自动生成用户电子邮件?
- c++ - C++ HashTable,两个相同的实现,但一个给出错误
- android - Android 媒体播放器错误状态消息?
- javascript - 忽略笔(触控笔)输入
- php - 如何将 ApcuCache 与 Symfony、Doctrine ORM 和 DoctrineCacheBundle 一起使用
- android - setProgress 不适用于 android progressBar
- ruby-on-rails - 我无法通过控制台创建用户 PG::UndefinedTable: ERROR: 关系“team_members”不存在
- android - 某些设备上的 UI 未更新