Пример #1
0
def getRoundPath(begin, center, close, end, radius, sidesPerRadian):
    "Get round path."
    beginComplex = begin.dropAxis()
    centerComplex = center.dropAxis()
    endComplex = end.dropAxis()
    beginComplexSegmentLength = abs(centerComplex - beginComplex)
    endComplexSegmentLength = abs(centerComplex - endComplex)
    minimumRadius = lineation.getMinimumRadius(beginComplexSegmentLength,
                                               endComplexSegmentLength, radius)
    if minimumRadius <= close:
        return [center]
    beginBevel = center + minimumRadius / beginComplexSegmentLength * (begin -
                                                                       center)
    endBevel = center + minimumRadius / endComplexSegmentLength * (end -
                                                                   center)
    beginBevelComplex = beginBevel.dropAxis()
    endBevelComplex = endBevel.dropAxis()
    midpointComplex = 0.5 * (beginBevelComplex + endBevelComplex)
    if radius < 0.0:
        centerComplex = midpointComplex + midpointComplex - centerComplex
    midpointMinusCenterComplex = midpointComplex - centerComplex
    midpointCenterLength = abs(midpointMinusCenterComplex)
    midpointEndLength = abs(midpointComplex - endBevelComplex)
    midpointCircleCenterLength = midpointEndLength * midpointEndLength / midpointCenterLength
    circleRadius = math.sqrt(midpointCircleCenterLength *
                             midpointCircleCenterLength +
                             midpointEndLength * midpointEndLength)
    circleCenterComplex = midpointComplex + midpointMinusCenterComplex * midpointCircleCenterLength / midpointCenterLength
    circleCenter = Vector3(circleCenterComplex.real, circleCenterComplex.imag,
                           center.z)
    endMinusCircleCenterComplex = endBevelComplex - circleCenterComplex
    beginMinusCircleCenter = beginBevel - circleCenter
    beginMinusCircleCenterComplex = beginMinusCircleCenter.dropAxis()
    angleDifference = euclidean.getAngleDifferenceByComplex(
        endMinusCircleCenterComplex, beginMinusCircleCenterComplex)
    steps = int(math.ceil(abs(angleDifference) * sidesPerRadian))
    stepPlaneAngle = euclidean.getWiddershinsUnitPolar(angleDifference /
                                                       float(steps))
    deltaZStep = (end.z - begin.z) / float(steps)
    roundPath = [beginBevel]
    for step in xrange(1, steps):
        beginMinusCircleCenterComplex = beginMinusCircleCenterComplex * stepPlaneAngle
        arcPointComplex = circleCenterComplex + beginMinusCircleCenterComplex
        arcPoint = Vector3(arcPointComplex.real, arcPointComplex.imag,
                           begin.z + deltaZStep * step)
        roundPath.append(arcPoint)
    return roundPath + [endBevel]
Пример #2
0
def getBevelPath( begin, center, close, end, radius ):
	"Get bevel path."
	beginComplex = begin.dropAxis()
	centerComplex = center.dropAxis()
	endComplex = end.dropAxis()
	beginComplexSegmentLength = abs( centerComplex - beginComplex )
	endComplexSegmentLength = abs( centerComplex - endComplex )
	minimumRadius = lineation.getMinimumRadius( beginComplexSegmentLength, endComplexSegmentLength, radius )
	if minimumRadius <= close:
		return [ center ]
	beginBevel = center + minimumRadius / beginComplexSegmentLength * ( begin - center )
	endBevel = center + minimumRadius / endComplexSegmentLength * ( end - center )
	if radius > 0.0:
		return [ beginBevel, endBevel ]
	midpointComplex = 0.5 * ( beginBevel.dropAxis() + endBevel.dropAxis() )
	spikeComplex = centerComplex + centerComplex - midpointComplex
	return [ beginBevel, Vector3( spikeComplex.real, spikeComplex.imag, center.z ), endBevel ]
Пример #3
0
def getBevelPath( begin, center, close, end, radius ):
	"Get bevel path."
	beginComplex = begin.dropAxis()
	centerComplex = center.dropAxis()
	endComplex = end.dropAxis()
	beginComplexSegmentLength = abs( centerComplex - beginComplex )
	endComplexSegmentLength = abs( centerComplex - endComplex )
	minimumRadius = lineation.getMinimumRadius( beginComplexSegmentLength, endComplexSegmentLength, radius )
	if minimumRadius <= close:
		return [ center ]
	beginBevel = center + minimumRadius / beginComplexSegmentLength * ( begin - center )
	endBevel = center + minimumRadius / endComplexSegmentLength * ( end - center )
	if radius > 0.0:
		return [ beginBevel, endBevel ]
	midpointComplex = 0.5 * ( beginBevel.dropAxis() + endBevel.dropAxis() )
	spikeComplex = centerComplex + centerComplex - midpointComplex
	return [ beginBevel, Vector3( spikeComplex.real, spikeComplex.imag, center.z ), endBevel ]
Пример #4
0
def getRoundPath(begin, center, close, end, radius, sidesPerRadian):
    "Get round path."
    beginComplex = begin.dropAxis()
    centerComplex = center.dropAxis()
    endComplex = end.dropAxis()
    beginComplexSegmentLength = abs(centerComplex - beginComplex)
    endComplexSegmentLength = abs(centerComplex - endComplex)
    minimumRadius = lineation.getMinimumRadius(beginComplexSegmentLength, endComplexSegmentLength, radius)
    if minimumRadius <= close:
        return [center]
    beginBevel = center + minimumRadius / beginComplexSegmentLength * (begin - center)
    endBevel = center + minimumRadius / endComplexSegmentLength * (end - center)
    beginBevelComplex = beginBevel.dropAxis()
    endBevelComplex = endBevel.dropAxis()
    midpointComplex = 0.5 * (beginBevelComplex + endBevelComplex)
    if radius < 0.0:
        centerComplex = midpointComplex + midpointComplex - centerComplex
    midpointMinusCenterComplex = midpointComplex - centerComplex
    midpointCenterLength = abs(midpointMinusCenterComplex)
    midpointEndLength = abs(midpointComplex - endBevelComplex)
    midpointCircleCenterLength = midpointEndLength * midpointEndLength / midpointCenterLength
    circleRadius = math.sqrt(
        midpointCircleCenterLength * midpointCircleCenterLength + midpointEndLength * midpointEndLength
    )
    circleCenterComplex = (
        midpointComplex + midpointMinusCenterComplex * midpointCircleCenterLength / midpointCenterLength
    )
    circleCenter = Vector3(circleCenterComplex.real, circleCenterComplex.imag, center.z)
    endMinusCircleCenterComplex = endBevelComplex - circleCenterComplex
    beginMinusCircleCenter = beginBevel - circleCenter
    beginMinusCircleCenterComplex = beginMinusCircleCenter.dropAxis()
    angleDifference = euclidean.getAngleDifferenceByComplex(endMinusCircleCenterComplex, beginMinusCircleCenterComplex)
    steps = int(math.ceil(abs(angleDifference) * sidesPerRadian))
    stepPlaneAngle = euclidean.getWiddershinsUnitPolar(angleDifference / float(steps))
    deltaZStep = (end.z - begin.z) / float(steps)
    roundPath = [beginBevel]
    for step in xrange(1, steps):
        beginMinusCircleCenterComplex = beginMinusCircleCenterComplex * stepPlaneAngle
        arcPointComplex = circleCenterComplex + beginMinusCircleCenterComplex
        arcPoint = Vector3(arcPointComplex.real, arcPointComplex.imag, begin.z + deltaZStep * step)
        roundPath.append(arcPoint)
    return roundPath + [endBevel]