1. 判断平面上一点是否在四边形内
思路
代码
/**
* 计算三角形面积
* @param a
* @param b
* @param c
* @return
*/
private static double triangleArea(Point a, Point b, Point c) {
double result = Math.abs((a.x * b.y + b.x * c.y + c.x * a.y - b.x * a.y - c.x * b.y - a.x * c.y) / 2);
return result;
}
/**
* 通过比较四边形面积与四边形各条边与p点组成三角形的面积和,得出点p是否在四边形内部
* @param p
*/
public void compare(Point p) {
double quadArea = (triangleArea(p1, p2, p3) + triangleArea(p1, p2, p4) + triangleArea(p1, p3, p4) + triangleArea(p2, p3, p4)) / 2;
double compareArea = triangleArea(p, p1, p2) + triangleArea(p, p2, p3) + triangleArea(p, p3, p4) + triangleArea(p, p4, p1);
System.out.println(compareArea==quadArea?"在四边形内":"在四边形外");
}
2. 实现类似MC连锁挖矿mod
在挖掉一格方块时,若有相同方块连接,则一起挖掉
思路
使用递归,在挖掉一格后,判断四个方向上有无相同方块,有则调用自身
代码
public void destroyWhere(int i, int j){
int flag = blocks[i][j].getMaterial();
blocks[i][j].setMaterial(9);
if (i < 4) {
if (flag == blocks[i + 1][j].getMaterial()) {
destroyWhere(i + 1, j);
}
}
if (i > 0) {
if (flag == blocks[i - 1][j].getMaterial()) {
destroyWhere(i - 1, j);
}
}
if (j < 4) {
if (flag == blocks[i][j + 1].getMaterial()) {
destroyWhere(i, j+1);
}
}
if (j > 0) {
if (flag == blocks[i][j - 1].getMaterial()) {
destroyWhere(i, j-1);
}
}
}
效果
挖第三行第三列