假设我有一个由3个点组成的三角形.

makeTriangle(x1, y1, x2, y2, x3, y3);

如何判断所述三角形是否包含某一组点?

我正在try 用P5制作一个交互式UI.js,其中包含一个箭头,可用于调整对象大小.线框代码为:

let Size, x, y, moving;

//runs once at the start of the program
function setup() {
  
  createCanvas(400, 400);
  
  Size = 100;
  x = 10;
  y = 10;
  moving = false;
  
}
//runs once every frame
function draw() {
  
  background(220);
  
  handleMouse();
  
  fill("grey");
  noStroke();
  
  square(x, y, Size, 5);
  
  fill("black");
  
  triangle( x + Size * 0.9, y + Size * 0.9,
  x + Size * 0.7, y + Size * 0.9,
  x + Size * 0.9, y + Size * 0.7 );
  
}

function handleMouse(){
  
  if(mouseInTriangle(/* x1, y1, x2, y2, x3, y3 */) && mouseIsPressed || mouseIsPressed && moving){
    
    moving = true;
    
  } else {
    
    moving = false;
    
  }
  
  if(moving){
    
    Size = max((mouseX + mouseY)/2 + x + y, 50);
    
  }
  
}

function mouseInTriangle(x1, y1, x2, y2, x3, y3){
  
  //Is mouse in triangle?
  
  return true;
  
}
<script src="https://cdn.jsdelivr.net/npm/p5@1.4.1/lib/p5.js"></script>

有没有一种动态的方法来判断一个点是否在三角形内?

推荐答案

我建议使用一种算法来比较三角形的面积.参见Check whether a given point lies inside a triangle or not.如果该点位于三角形中,则该点将三角形分为3个较小的三角形.计算这3个三角形的面积之和,并将其与原始三角形的面积进行比较:

function getArea(a, b, c) {
    return abs((a[0]*(b[1]-c[1]) + b[0]*(c[1]-a[1])+ c[0]*(a[1]-b[1]))/2);
}

function mouseInTriangle(x1, y1, x2, y2, x3, y3){
    let point = [mouseX, mouseY];
    let area = getArea([x1, y1], [x2, y2], [x3, y3]);
    let areaA = getArea([x1, y1], [x2, y2], point);
    let areaB = getArea(point, [x2, y2], [x3, y3]);
    let areaC = getArea([x1, y1], point, [x3, y3]);
    return abs(areaA + areaB + areaC - area) < 0.001;
}

let x1, y1, x2, y2, x3, y3;    
let Size, x, y, moving;

//runs once at the start of the program
function setup() {
  
  createCanvas(400, 400);
  
  Size = 100;
  x = 10;
  y = 10;
  moving = false;
  
}
//runs once every frame
function draw() {
  
  background(220);
  handleMouse();
  
  fill("grey");
  noStroke();
  square(x, y, Size, 5);
  fill("black");
  
  x1 = x + Size * 0.9;
  y1 = y + Size * 0.9;
  x2 = x + Size * 0.7;
  y2 = y + Size * 0.9;
  x3 = x + Size * 0.9;
  y3 = y + Size * 0.7;
  triangle(x1, y1, x2, y2, x3, y3);
  
}

function handleMouse(){
    if(mouseIsPressed && (moving || mouseInTriangle(x1, y1, x2, y2, x3, y3))) {
        moving = true;
        Size = max((mouseX + mouseY)/2 + x + y, 50);
    } else {
        moving = false;
    }
}

function getArea(a, b, c) {
    return abs((a[0]*(b[1]-c[1]) + b[0]*(c[1]-a[1])+ c[0]*(a[1]-b[1]))/2);
}

function mouseInTriangle(x1, y1, x2, y2, x3, y3){
    let point = [mouseX, mouseY];
    let area = getArea([x1, y1], [x2, y2], [x3, y3]);
    let areaA = getArea([x1, y1], [x2, y2], point);
    let areaB = getArea(point, [x2, y2], [x3, y3]);
    let areaC = getArea([x1, y1], point, [x3, y3]);
    return abs(areaA + areaB + areaC - area) < 0.001;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.1/p5.min.js"></script>

Javascript相关问答推荐

zoom svg以适应圆

为什么我的列表直到下一次提交才更新值/onChange

Spring boot JSON解析错误:意外字符错误

如何在Obsidian dataview中创建进度条

为什么promise对js中的错误有一个奇怪的优先级?

处理时间和字符串时MySQL表中显示的日期无效

分层树视图

v—自动完成不显示 Select 列表中的所有项目

使用Java脚本导入gltf场景并创建边界框

如何在箭头函数中引入or子句?

从另一个数组中的对应行/键值对更新数组中的键值对对象

搜索功能不是在分页的每一页上进行搜索

<;img>;标记无法呈现图像

传递方法VS泛型对象VS事件特定对象

react 路由DOM有条件地呈现元素

如何在TransformControls模式下只保留箭头进行翻译?

当S点击按钮时,我如何才能改变它的样式?

我如何才能让p5.js在不使用实例模式的情况下工作?

找不到处于状态的联系人

App Script如何读取通过云函数传递的表单对象