ให้จุดหลายจุดที่ต่อกันเป็นรูปหลายเหลี่ยม (Simple Polygon - ไม่มีขอบตัดกัน) ตรวจสอบว่ารูปนี้เป็น **Convex Polygon (รูปหลายเหลี่ยมคอนเว็กซ์)** หรือไม่
นิยาม Convex: มุมภายในทุกมุม ≤ 180° หรือ **Cross Product ของ Vector ขอบติดกันทุกคู่ มีเครื่องหมายเดียวกัน** (ทั้งหมดบวก หรือทั้งหมดลบ)
ตัวอย่าง
Points: [[0,0], [0,1], [1,1], [1,0]] // สี่เหลี่ยมจัตุรัส Output: true (Convex)
อัลกอริทึม: Cross Product Sign Consistency
- สำหรับแต่ละ Vertex
iพิจารณา 3 จุดติดกัน:A = points[i], B = points[(i+1)%n], C = points[(i+2)%n] - คำนวณ Cross Product ของ Vector
BAและBC:BA = A - B BC = C - B Cross = BA.x * BC.y - BA.y * BC.x
- Track ว่าเคยเจอ Cross > 0 (Positive) และ Cross < 0 (Negative) หรือไม่
- ถ้าเจอ **ทั้งสองเครื่องหมาย** -> **Concave (ไม่ใช่ Convex)** -> Return false
- จบลูปเจอเครื่องหมายเดียว -> Return true
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isConvex(vector<vector<int>>& points) {
bool neg = false, pos = false;
int n = points.size();
for (int i = 0; i < n; i++) {
int a = i;
int b = (i + 1) % n;
int c = (i + 2) % n;
int cross = calc(points[a][0], points[a][1],
points[b][0], points[b][1],
points[c][0], points[c][1]);
if (cross < 0) neg = true;
else if (cross > 0) pos = true;
if (neg && pos) return false; // พบทั้งสองเครื่องหมาย -> Concave
}
return true;
}
int calc(int ax, int ay, int bx, int by, int cx, int cy) {
int BAx = ax - bx, BAy = ay - by;
int BCx = cx - bx, BCy = cy - by;
return BAx * BCy - BAy * BCx; // Cross Product (2D)
}
};
Input / Output
Input: [[0,0],[0,1],[1,1],[1,0]] Output: 1 (true)
ความซับซ้อน (Complexity)
- Time: O(N) — วนลูป 1 รอบ
- Space: O(1)
หมายเหตุ
- โจทย์รับประกันว่าเป็น Simple Polygon (ไม่ต้องเช็ค Self-intersection)
- Cross Product = 0 หมายถึง Collinear (มุม 180°) ยอมรับได้ใน Convex
- ใช้
long longถ้าพิกัดใหญ่ (ป้องกัน Overflow)
วิธีนี้เป็นมาตรฐานสำหรับ Convex Polygon Check ครับ