WIP 2-point perspective
Works okay assuming vanishing points form a horizontal line, but that won't always be the case.
This commit is contained in:
parent
f68909c70e
commit
a72e5b9b42
1 changed files with 50 additions and 4 deletions
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
by Bill Kendrick <bill@newbreedsoftware.com>
|
by Bill Kendrick <bill@newbreedsoftware.com>
|
||||||
|
|
||||||
December 12, 2023 - December 17, 2023
|
December 12, 2023 - December 21, 2023
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -181,7 +181,7 @@ int n_pt_persp_init(magic_api * api, Uint32 disabled_features ATTRIBUTE_UNUSED)
|
||||||
|
|
||||||
int n_pt_persp_get_tool_count(magic_api * api ATTRIBUTE_UNUSED)
|
int n_pt_persp_get_tool_count(magic_api * api ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
return 2; // FIXME
|
return 4; // FIXME
|
||||||
//return (NUM_TOOLS);
|
//return (NUM_TOOLS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -401,8 +401,54 @@ void n_pt_persp_work(magic_api * api, int which,
|
||||||
} else if (which == TOOL_2PT_DRAW) {
|
} else if (which == TOOL_2PT_DRAW) {
|
||||||
/* 2-point perspective */
|
/* 2-point perspective */
|
||||||
|
|
||||||
/* FIXME */
|
x1 = line_start_x;
|
||||||
return;
|
y1 = line_start_y;
|
||||||
|
|
||||||
|
if (abs(line_start_x - x) <= SNAP) {
|
||||||
|
/* Vertical */
|
||||||
|
x2 = x1;
|
||||||
|
y2 = y;
|
||||||
|
} else if (abs(line_start_y - y) <= SNAP) {
|
||||||
|
/* Horizontal */
|
||||||
|
x2 = x;
|
||||||
|
y2 = y1;
|
||||||
|
} else {
|
||||||
|
int ok, i;
|
||||||
|
|
||||||
|
/* Diagonal */
|
||||||
|
|
||||||
|
ok = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 2 && ok == 0; i++) {
|
||||||
|
slope = ((float) y1 - (float) a2_pt_y[i]) / ((float) x1 - (float) a2_pt_x[i]);
|
||||||
|
x2 = x;
|
||||||
|
y2 = line_start_y + (slope * (x - line_start_x));
|
||||||
|
|
||||||
|
/* Don't go past our cursor's Y */
|
||||||
|
if ((y < line_start_y && y2 < y) ||
|
||||||
|
(y > line_start_y && y2 > y)) {
|
||||||
|
if (slope != 0.0) {
|
||||||
|
y2 = y;
|
||||||
|
x2 = ((y - line_start_y) / slope) + line_start_x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wrong side? Use the point 2 */
|
||||||
|
slope2 = ((float) line_start_y - (float) y) / ((float) line_start_x - (float) x);
|
||||||
|
if ((slope2 > 0.00 && slope < 0.00) ||
|
||||||
|
(slope2 < 0.00 && slope > 0.00)) {
|
||||||
|
ok = 0;
|
||||||
|
|
||||||
|
if (i == 1) {
|
||||||
|
/* Worst case, snap to horizontal */
|
||||||
|
x2 = x;
|
||||||
|
y2 = y1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ok = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (which == TOOL_3PT_DRAW) {
|
} else if (which == TOOL_3PT_DRAW) {
|
||||||
/* 3-point perspective */
|
/* 3-point perspective */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue