From: <sie...@us...> - 2009-10-03 17:46:28
|
Revision: 12639 http://alleg.svn.sourceforge.net/alleg/?rev=12639&view=rev Author: siegelord Date: 2009-10-03 17:46:09 +0000 (Sat, 03 Oct 2009) Log Message: ----------- Made the ribbon drawer handle the case of extremely sharp corners more gracefully. Modified Paths: -------------- allegro/branches/4.9/addons/primitives/high_primitives.c Modified: allegro/branches/4.9/addons/primitives/high_primitives.c =================================================================== --- allegro/branches/4.9/addons/primitives/high_primitives.c 2009-09-30 22:28:23 UTC (rev 12638) +++ allegro/branches/4.9/addons/primitives/high_primitives.c 2009-10-03 17:46:09 UTC (rev 12639) @@ -766,6 +766,8 @@ float prev_dir_y = 0; float t = thickness / 2; float tx, ty; + float nx, ny; + float sign = 1; for (ii = 0; ii < 2 * num_segments - 2; ii += 2) { float dir_len; @@ -793,30 +795,54 @@ if (ii == 0) { tx = -t * cur_dir_y; ty = t * cur_dir_x; + nx = 0; + ny = 0; } else { - float norm_len, new_norm_len, cosine; - tx = cur_dir_y + prev_dir_y; - ty = -(cur_dir_x + prev_dir_x); - norm_len = (float)hypot(tx, ty); - if(norm_len > 0.000001f) { + float dot = cur_dir_x * prev_dir_x + cur_dir_y * prev_dir_y; + float norm_len, cosine; + if(dot < 0) { + /* + * This is by no means exact, but seems to produce acceptable results + */ + float tx_; + tx = cur_dir_x - prev_dir_x; + ty = cur_dir_y - prev_dir_y; + norm_len = (float)hypot(tx, ty); + tx /= norm_len; ty /= norm_len; + + cosine = tx * cur_dir_x + ty * cur_dir_y; + + nx = -t * tx / cosine; + ny = -t * ty / cosine; + tx_ = tx; + tx = -t * ty * cosine; + ty = t * tx_ * cosine; + sign = -sign; + } else { + float new_norm_len; + tx = cur_dir_y + prev_dir_y; + ty = -(cur_dir_x + prev_dir_x); + norm_len = (float)hypot(tx, ty); + + tx /= norm_len; + ty /= norm_len; cosine = tx * (-cur_dir_y) + ty * (cur_dir_x); new_norm_len = t / cosine; tx *= new_norm_len; ty *= new_norm_len; - } else { - tx = -t * cur_dir_y; - ty = t * cur_dir_x; + nx = 0; + ny = 0; } } - *dest = x - tx; - *(dest + 1) = y - ty; + *dest = x - sign * tx + nx; + *(dest + 1) = y - sign * ty + ny; dest = (float*)(((char*)dest) + dest_stride); - *dest = x + tx; - *(dest + 1) = y + ty; + *dest = x + sign * tx + nx; + *(dest + 1) = y + sign * ty + ny; dest = (float*)(((char*)dest) + dest_stride); prev_dir_x = cur_dir_x; @@ -828,11 +854,11 @@ x = *points; y = *(points + 1); - *dest = x - tx; - *(dest + 1) = y - ty; + *dest = x - sign * tx; + *(dest + 1) = y - sign * ty; dest = (float*)(((char*)dest) + dest_stride); - *dest = x + tx; - *(dest + 1) = y + ty; + *dest = x + sign * tx; + *(dest + 1) = y + sign * ty; } else { int ii; for (ii = 0; ii < num_segments; ii++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |