2010-02-22 6 views
1

Problem illustration http://i49.tinypic.com/2iui4g.jpgКак определить подтреугольника внутри прямоугольника заданной координаты в этом прямоугольнике

Учитывая прямоугольник шириной ш и высотой Н. и координату x, y в этом прямоугольнике я хотел бы определить, какой треугольник я внутри.

То есть функция должна принимать параметры (x, y) и возвращать a, b, c, d или нулевое число, представляющее этот индекс треугольника, то есть (0 = A, 1 = B, 2 = C, 3 = D), если они находятся в указанном порядке.

Я думаю, что это будет что-то вроде> = формула красной линии и> = формула зеленой линии?

Я хотел бы реализовать это в VB.NET

+0

Если это домашнее задание, то, пожалуйста, пометить его как таковой (это не остановит ответы). – Richard

+0

это не домашнее задание, а часть более крупной проблемы: http://stackoverflow.com/questions/2310334/texture-coordinate-mapping-how-to-map-coordinates-of-4-triangles-in-a-square- to-4 – PeanutPower

ответ

6
aboveRed = x*h > y*w; 
aboveGreen = (w-x)*h > y*w; 
if (aboveRed) 
{ 
    if (aboveGreen) return "C"; else return "B"; 
} 
else 
{ 
    if (aboveGreen) return "D"; else return "A"; 
} 
+0

ahh это выглядит неплохо – PeanutPower

1

я хотел бы рассмотреть угол линии до точки с верхнего левого и верхнего правого углов. Если в обоих случаях оно меньше 45 градусов (регулировка для основного направления края), то точка находится в C. Другие комбинации будут охватывать три других треугольника.

На самом деле вам не нужно вычислять обратные триггерные функции, так как отношение длин линий дает вам достаточно информации (а sin (45) ... или, скорее, sin (pi/4) фиксированное значение).

3

Уравнение зеленой линии: h * x + w * y = h * w

Уравнение красной линии: x * h - y * w = 0

Public Function GetTriangleNumber(ByVal x As Integer, ByVal y As Integer) 
                    As Integer 
    Dim overGreenLine As Boolean = ((((h * x) + (w * y)) - (h * w)) < 0) 
    Dim overRedLine As Boolean = (((h * x) - (w * y)) > 0) 
    If overGreenLine Then 
     Return IIf(overRedLine, 2, 3) 
    End If 
    Return IIf(overRedLine, 1, 0) 
End Function 
+0

спасибо, что я дал upvote для кода VB, но принял ответ Влада, когда он первым попал туда с алгоритмом – PeanutPower

Смежные вопросы