union_cocircular_contours_xldunion_cocircular_contours_xldUnionCocircularContoursXldUnionCocircularContoursXldunion_cocircular_contours_xld (Operator)

Name

union_cocircular_contours_xldunion_cocircular_contours_xldUnionCocircularContoursXldUnionCocircularContoursXldunion_cocircular_contours_xld — Compute the union of contours that belong to the same circle.

Signature

union_cocircular_contours_xld(Contours : UnionContours : MaxArcAngleDiff, MaxArcOverlap, MaxTangentAngle, MaxDist, MaxRadiusDiff, MaxCenterDist, MergeSmallContours, Iterations : )

Herror union_cocircular_contours_xld(const Hobject Contours, Hobject* UnionContours, double MaxArcAngleDiff, double MaxArcOverlap, double MaxTangentAngle, double MaxDist, double MaxRadiusDiff, double MaxCenterDist, const char* MergeSmallContours, const Hlong Iterations)

Herror T_union_cocircular_contours_xld(const Hobject Contours, Hobject* UnionContours, const Htuple MaxArcAngleDiff, const Htuple MaxArcOverlap, const Htuple MaxTangentAngle, const Htuple MaxDist, const Htuple MaxRadiusDiff, const Htuple MaxCenterDist, const Htuple MergeSmallContours, const Htuple Iterations)

void UnionCocircularContoursXld(const HObject& Contours, HObject* UnionContours, const HTuple& MaxArcAngleDiff, const HTuple& MaxArcOverlap, const HTuple& MaxTangentAngle, const HTuple& MaxDist, const HTuple& MaxRadiusDiff, const HTuple& MaxCenterDist, const HTuple& MergeSmallContours, const HTuple& Iterations)

HXLDCont HXLDCont::UnionCocircularContoursXld(const HTuple& MaxArcAngleDiff, const HTuple& MaxArcOverlap, const HTuple& MaxTangentAngle, const HTuple& MaxDist, const HTuple& MaxRadiusDiff, const HTuple& MaxCenterDist, const HString& MergeSmallContours, Hlong Iterations) const

HXLDCont HXLDCont::UnionCocircularContoursXld(double MaxArcAngleDiff, double MaxArcOverlap, double MaxTangentAngle, double MaxDist, double MaxRadiusDiff, double MaxCenterDist, const HString& MergeSmallContours, Hlong Iterations) const

HXLDCont HXLDCont::UnionCocircularContoursXld(double MaxArcAngleDiff, double MaxArcOverlap, double MaxTangentAngle, double MaxDist, double MaxRadiusDiff, double MaxCenterDist, const char* MergeSmallContours, Hlong Iterations) const

HXLDCont HXLDCont::UnionCocircularContoursXld(double MaxArcAngleDiff, double MaxArcOverlap, double MaxTangentAngle, double MaxDist, double MaxRadiusDiff, double MaxCenterDist, const wchar_t* MergeSmallContours, Hlong Iterations) const   (Windows only)

static void HOperatorSet.UnionCocircularContoursXld(HObject contours, out HObject unionContours, HTuple maxArcAngleDiff, HTuple maxArcOverlap, HTuple maxTangentAngle, HTuple maxDist, HTuple maxRadiusDiff, HTuple maxCenterDist, HTuple mergeSmallContours, HTuple iterations)

HXLDCont HXLDCont.UnionCocircularContoursXld(HTuple maxArcAngleDiff, HTuple maxArcOverlap, HTuple maxTangentAngle, HTuple maxDist, HTuple maxRadiusDiff, HTuple maxCenterDist, string mergeSmallContours, int iterations)

HXLDCont HXLDCont.UnionCocircularContoursXld(double maxArcAngleDiff, double maxArcOverlap, double maxTangentAngle, double maxDist, double maxRadiusDiff, double maxCenterDist, string mergeSmallContours, int iterations)

def union_cocircular_contours_xld(contours: HObject, max_arc_angle_diff: Union[int, float], max_arc_overlap: Union[int, float], max_tangent_angle: Union[int, float], max_dist: Union[int, float], max_radius_diff: Union[int, float], max_center_dist: Union[int, float], merge_small_contours: str, iterations: int) -> HObject

Description

The operator union_cocircular_contours_xldunion_cocircular_contours_xldUnionCocircularContoursXldUnionCocircularContoursXldUnionCocircularContoursXldunion_cocircular_contours_xld merges all contours that belong to the same circle. The result is a set of contours in which contours on the same circle are connected.

The algorithm tries to merge contours by first fitting circles to each contour and then examining the result by means of radius, circle center, and gap on the circular arc. The list of contours is processed in sequence of increasing radii. Contours to which no circle could be fitted are optionally merged in a second pass.

The threshold parameters are used to define whether contours belong to the same circle. All thresholds must be fulfilled simultaneously for two contours to be merged.

Parameters

MaxArcAngleDiffMaxArcAngleDiffMaxArcAngleDiffMaxArcAngleDiffmaxArcAngleDiffmax_arc_angle_diff

The parameter MaxArcAngleDiffMaxArcAngleDiffMaxArcAngleDiffMaxArcAngleDiffmaxArcAngleDiffmax_arc_angle_diff defines the maximum angular distance in radians between the end point of one contour and the start point of a second contour on a circle.

image/svg+xml a x
MaxArcOverlapMaxArcOverlapMaxArcOverlapMaxArcOverlapmaxArcOverlapmax_arc_overlap

MaxArcOverlapMaxArcOverlapMaxArcOverlapMaxArcOverlapmaxArcOverlapmax_arc_overlap denotes the maximum angle by which contours may overlap.

image/svg+xml x a
MaxTangentAngleMaxTangentAngleMaxTangentAngleMaxTangentAnglemaxTangentAnglemax_tangent_angle

MaxTangentAngleMaxTangentAngleMaxTangentAngleMaxTangentAnglemaxTangentAnglemax_tangent_angle describes the maximum angle between circle tangents and the connecting line of two contours.

image/svg+xml a x
MaxDistMaxDistMaxDistMaxDistmaxDistmax_dist

MaxDistMaxDistMaxDistMaxDistmaxDistmax_dist denotes the maximum absolute distance in pixels of the end and start points of two contours.

image/svg+xml a x
MaxRadiusDiffMaxRadiusDiffMaxRadiusDiffMaxRadiusDiffmaxRadiusDiffmax_radius_diff

MaxRadiusDiffMaxRadiusDiffMaxRadiusDiffMaxRadiusDiffmaxRadiusDiffmax_radius_diff is the maximum absolute difference of the radii of circles fitted to the contours.

image/svg+xml x a
MaxCenterDistMaxCenterDistMaxCenterDistMaxCenterDistmaxCenterDistmax_center_dist

MaxCenterDistMaxCenterDistMaxCenterDistMaxCenterDistmaxCenterDistmax_center_dist is the limit of the Euclidian distance of the circle centers.

image/svg+xml x x a
MergeSmallContoursMergeSmallContoursMergeSmallContoursMergeSmallContoursmergeSmallContoursmerge_small_contours

If the parameter MergeSmallContoursMergeSmallContoursMergeSmallContoursMergeSmallContoursmergeSmallContoursmerge_small_contours is set to 'true'"true""true""true""true""true", contours without fitted circles are also merged. For a small contour to match, each point of the contour needs to have a distance to the circle center which differs from the radius by not more then MaxRadiusDiffMaxRadiusDiffMaxRadiusDiffMaxRadiusDiffmaxRadiusDiffmax_radius_diff. The angle between a line between two consecutive points on the contour and the circle tangent must be within MaxTangentAngleMaxTangentAngleMaxTangentAngleMaxTangentAnglemaxTangentAnglemax_tangent_angle. Additionally, the condition for MaxDistMaxDistMaxDistMaxDistmaxDistmax_dist must be fulfilled for two contours to be merged.

IterationsIterationsIterationsIterationsiterationsiterations

Merging of contours leads to new circle parameters. Therefore, an iteration can lead to further merges. The parameter IterationsIterationsIterationsIterationsiterationsiterations controls the number of iterations. More than two iterations are seldom needed.

For each possible merge of two contours a cost is calculated by summing up the distances corresponding to the different threshold values. For comparability, the distances are scaled by the thresholds to a value between 0.0 and 1.0. If two or more contour start points match to the same end point of another contour, the contour with the lower cost is merged.

You should make sure that the input contours can be approximated by lines and circular arcs, for example by preprocessing them with split_contours_xldsplit_contours_xldSplitContoursXldSplitContoursXldSplitContoursXldsplit_contours_xld.

Attention

Note that already closed contours are not considered for a union anymore. That is, even if a contour and the already closed contour share the same circle, they are returned as separate contours.

Execution Information

Parameters

ContoursContoursContoursContourscontourscontours (input_object)  xld_cont-array objectHXLDContHObjectHXLDContHobject

Contours to be merged.

UnionContoursUnionContoursUnionContoursUnionContoursunionContoursunion_contours (output_object)  xld_cont-array objectHXLDContHObjectHXLDContHobject *

Merged contours.

MaxArcAngleDiffMaxArcAngleDiffMaxArcAngleDiffMaxArcAngleDiffmaxArcAngleDiffmax_arc_angle_diff (input_control)  angle.rad HTupleUnion[int, float]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Maximum angular distance of two circular arcs.

Default value: 0.5

Suggested values: 0.25, 0.5, 0.75, 1.0

MaxArcOverlapMaxArcOverlapMaxArcOverlapMaxArcOverlapmaxArcOverlapmax_arc_overlap (input_control)  angle.rad HTupleUnion[int, float]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Maximum overlap of two circular arcs.

Default value: 0.1

Suggested values: 0.0, 0.1, 0.2

MaxTangentAngleMaxTangentAngleMaxTangentAngleMaxTangentAnglemaxTangentAnglemax_tangent_angle (input_control)  angle.rad HTupleUnion[int, float]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Maximum angle between the connecting line and the tangents of circular arcs.

Default value: 0.2

Suggested values: 0.1, 0.2, 0.3, 0.4, 0.5

MaxDistMaxDistMaxDistMaxDistmaxDistmax_dist (input_control)  number HTupleUnion[int, float]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Maximum length of the gap between two circular arcs in pixels.

Default value: 30

Suggested values: 10, 30, 50, 70

MaxRadiusDiffMaxRadiusDiffMaxRadiusDiffMaxRadiusDiffmaxRadiusDiffmax_radius_diff (input_control)  number HTupleUnion[int, float]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Maximum radius difference of the circles fitted to two arcs.

Default value: 10

Suggested values: 10, 20, 30

MaxCenterDistMaxCenterDistMaxCenterDistMaxCenterDistmaxCenterDistmax_center_dist (input_control)  number HTupleUnion[int, float]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Maximum center distance of the circles fitted to two arcs.

Default value: 10

Suggested values: 10, 20, 30

MergeSmallContoursMergeSmallContoursMergeSmallContoursMergeSmallContoursmergeSmallContoursmerge_small_contours (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Determine whether small contours without fitted circles should also be merged.

Default value: 'true' "true" "true" "true" "true" "true"

List of values: 'false'"false""false""false""false""false", 'true'"true""true""true""true""true"

IterationsIterationsIterationsIterationsiterationsiterations (input_control)  integer HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Number of iterations.

Default value: 1

Suggested values: 1, 2

Complexity

O(n^2) for n contours.

Result

union_cocircular_contours_xldunion_cocircular_contours_xldUnionCocircularContoursXldUnionCocircularContoursXldUnionCocircularContoursXldunion_cocircular_contours_xld returns 2 (H_MSG_TRUE) if all parameters are correct.

Possible Predecessors

split_contours_xldsplit_contours_xldSplitContoursXldSplitContoursXldSplitContoursXldsplit_contours_xld, select_contours_xldselect_contours_xldSelectContoursXldSelectContoursXldSelectContoursXldselect_contours_xld

Alternatives

union_collinear_contours_xldunion_collinear_contours_xldUnionCollinearContoursXldUnionCollinearContoursXldUnionCollinearContoursXldunion_collinear_contours_xld, union_cotangential_contours_xldunion_cotangential_contours_xldUnionCotangentialContoursXldUnionCotangentialContoursXldUnionCotangentialContoursXldunion_cotangential_contours_xld, union_straight_contours_xldunion_straight_contours_xldUnionStraightContoursXldUnionStraightContoursXldUnionStraightContoursXldunion_straight_contours_xld, union_adjacent_contours_xldunion_adjacent_contours_xldUnionAdjacentContoursXldUnionAdjacentContoursXldUnionAdjacentContoursXldunion_adjacent_contours_xld, union_collinear_contours_ext_xldunion_collinear_contours_ext_xldUnionCollinearContoursExtXldUnionCollinearContoursExtXldUnionCollinearContoursExtXldunion_collinear_contours_ext_xld

Module

Foundation