Changeset 8028 for trunk/anuga_core/source/anuga/utilities/polygon_ext.c
 Timestamp:
 Oct 7, 2010, 2:49:29 PM (13 years ago)
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

trunk/anuga_core/source/anuga/utilities/polygon_ext.c
r8025 r8028 315 315 316 316 317 int __polygon_triangle_overlap(double* polygon, 318 double* triangle) 319 { 320 int i, ii, j, jj; 321 double p0_x, p0_y, p1_x, p1_y, pp_x, pp_y; 322 double t0_x, t0_y, t1_x, t1_y, tp_x, tp_y; 323 double u_x, u_y, v_x, v_y, w_x, w_y; 324 double u_dot_tp, v_dot_tp, v_dot_pp, w_dot_pp; 325 double a, b; 326 327 p0_x = polygon[0]; 328 p0_y = polygon[1]; 329 330 for (i = 1; i < 5; i++) 331 { 332 ii = i%4; 333 334 p1_x = polygon[2*ii]; 335 p1_y = polygon[2*ii + 1]; 336 337 pp_x = (p1_y  p0_y); 338 pp_y = p1_x  p0_x; 339 340 t0_x = triangle[0]; 341 t0_y = triangle[1]; 342 343 for (j = 1; j < 4; j++) 344 { 345 jj = j%3; 346 347 t1_x = triangle[2*jj]; 348 t1_y = triangle[2*jj + 1]; 349 350 tp_x = (t1_y  t0_y); //perpendicular to triangle vector 351 tp_y = t1_x  t0_x; 352 353 u_x = p1_x  p0_x; 354 u_y = p1_y  p0_y; 355 v_x = t0_x  p0_x; 356 v_y = t0_y  p0_y; 357 w_x = t1_x  t0_x; 358 w_y = t1_y  t0_y; 359 360 u_dot_tp = (u_x*tp_x) + (u_y*tp_y); 361 362 if (u_dot_tp != 0.0f) //Vectors are not parallel 363 { 364 v_dot_tp = (v_x*tp_x) + (v_y*tp_y); 365 v_dot_pp = (v_x*pp_x) + (v_y*pp_y); 366 w_dot_pp = (w_x*pp_x) + (w_y*pp_y); 367 368 a = v_dot_tp/u_dot_tp; 369 b = v_dot_pp/w_dot_pp; 370 371 if (a >= 0.0f && a <= 1.0f) 372 { 373 return 1; //overlap 374 } 375 376 if (b >= 0.0f && b <= 1.0f) 377 { 378 return 1; //overlap 379 } 380 } 381 382 t0_x = t1_x; 383 t0_y = t1_y; 384 } 385 386 p0_x = p1_x; 387 p0_y = p1_y; 388 } 389 390 return 0; //no overlap 391 } 392 393 394 317 395 int __is_inside_triangle(double* point, 318 396 double* triangle, … … 575 653 576 654 655 PyObject *_polygon_triangle_overlap(PyObject *self, PyObject *args) { 656 // 657 // _polygon_triangle_overlap(polygon, triangle) 658 // 659 660 661 PyArrayObject 662 *polygon, 663 *triangle; 664 665 int res; 666 667 PyObject *result; 668 669 // Convert Python arguments to C 670 if (!PyArg_ParseTuple(args, "OO", 671 &polygon, 672 &triangle)) { 673 674 PyErr_SetString(PyExc_RuntimeError, 675 "_polygon_triangle_overlap could not parse input"); 676 return NULL; 677 } 678 679 // Call underlying routine 680 res = __polygon_triangle_overlap((double*) polygon>data, 681 (double*) triangle > data); 682 683 684 // Return result 685 result = Py_BuildValue("i", res); 686 return result; 687 } 577 688 578 689
Note: See TracChangeset
for help on using the changeset viewer.