This is MiscCircleShape.m in view mode; [Download] [Up]
/* Copyright (c) Uwe Hoffmann, 1995. All Rights Reserved. Filename: MiscCircleShape.m Author: Uwe Hoffmann Date: Sep 07, 1995 $Id: MiscCircleShape.m,v 1.0 1995/09/07 11:22:00 Uwe Hoffmann Exp $ $Log: MiscCircleShape.m,v $ */ #import <appkit/appkit.h> #import "MiscCircleShape.h" #import "MiscUserPath.h" #import "MiscHitPath.h" @implementation MiscCircleShape - (NSRect)innerBounds { return [path bounds]; } - (MiscShapeType)shapeType { return MiscCircleShapeType; } - (void)calcIntersection:(NSPoint *)ip angle:(float *)alpha toPoint:(NSPoint)aPoint { NSPoint middle,pos; float s,x0,y0,a,b,width,height,*bbox; bbox = [path bbox]; pos.x = bbox[0]; pos.y = bbox[1]; width = bbox[2] - bbox[0]; height = bbox[3] - bbox[1]; middle.x = pos.x + width / 2; middle.y = pos.y + height / 2; if(aPoint.y == middle.y){ *alpha = 0; ip->y = middle.y; if(aPoint.x > middle.x) ip->x = pos.x + width; else ip->x = pos.x; return; } if(aPoint.x == middle.x){ ip->x = middle.x; if(aPoint.y > middle.y){ ip->y = pos.y + height; *alpha = -90; } else { ip->y = pos.y; *alpha = 90; } return; } s = (aPoint.y - middle.y) / (aPoint.x - middle.x); *alpha = 57.29577951 * atan(s); if(aPoint.y > middle.y){ if(aPoint.x > middle.x){ // 4. quadrant x0 = middle.x; y0 = middle.y; a = width / 2; b = height / 2; ip->x = a*b/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + x0; ip->y = (2*a*b*s/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + 2*y0)/2; if(ip->y < y0){ ip->x = -(a*b/sqrt(pow(b,2) + pow(a,2)*pow(s,2))) + x0; ip->y = (-2*a*b*s/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + 2*y0)/2; } } else { // 3. quadrant x0 = middle.x; y0 = middle.y; a = width / 2; b = height / 2; ip->x = a*b/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + x0; ip->y = (2*a*b*s/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + 2*y0)/2; if(ip->y < y0){ ip->x = -(a*b/sqrt(pow(b,2) + pow(a,2)*pow(s,2))) + x0; ip->y = (-2*a*b*s/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + 2*y0)/2; } } } else { if(aPoint.x > middle.x){ // 1. quadrant x0 = middle.x; y0 = middle.y; a = width / 2; b = height / 2; ip->x = a*b/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + x0; ip->y = (2*a*b*s/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + 2*y0)/2; if(ip->y > y0){ ip->x = -(a*b/sqrt(pow(b,2) + pow(a,2)*pow(s,2))) + x0; ip->y = (-2*a*b*s/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + 2*y0)/2; } } else { // 2. quadrant x0 = middle.x; y0 = middle.y; a = width / 2; b = height / 2; ip->x = a*b/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + x0; ip->y = (2*a*b*s/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + 2*y0)/2; if(ip->y > y0){ ip->x = -(a*b/sqrt(pow(b,2) + pow(a,2)*pow(s,2))) + x0; ip->y = (-2*a*b*s/sqrt(pow(b,2) + pow(a,2)*pow(s,2)) + 2*y0)/2; } } } } - (void)makePathWithBounds:(NSRect)aRect { [path moveto:(aRect.origin.x + aRect.size.width) :(aRect.origin.y + aRect.size.height / 2)]; [path curveto:(aRect.origin.x + aRect.size.width) :(aRect.origin.y + aRect.size.height / 2 * 0.445) :(aRect.origin.x + aRect.size.width / 2 * 1.555) :aRect.origin.y :(aRect.origin.x + aRect.size.width / 2) :aRect.origin.y]; [path curveto:(aRect.origin.x + aRect.size.width / 2 * 0.445) :aRect.origin.y :aRect.origin.x :(aRect.origin.y + aRect.size.height / 2 * 0.445) :aRect.origin.x :(aRect.origin.y + aRect.size.height / 2)]; [path curveto:aRect.origin.x :(aRect.origin.y + aRect.size.height /2 * 1.555) :(aRect.origin.x + aRect.size.width / 2 * 0.445) :(aRect.origin.y + aRect.size.height) :(aRect.origin.x + aRect.size.width / 2) :(aRect.origin.y + aRect.size.height)]; [path curveto:(aRect.origin.x + aRect.size.width / 2 * 1.555) :(aRect.origin.y + aRect.size.height) :(aRect.origin.x + aRect.size.width) :(aRect.origin.y + aRect.size.height / 2 * 1.555) :(aRect.origin.x + aRect.size.width) :(aRect.origin.y + aRect.size.height / 2)]; } - (void)fillParamsWithBounds:(NSRect)aRect { float *params, *bbox; params = [path params]; bbox = [path bbox]; bbox[0] = aRect.origin.x; bbox[1] = aRect.origin.y; bbox[2] = aRect.origin.x + aRect.size.width; bbox[3] = aRect.origin.y + aRect.size.height; params[0] = aRect.origin.x + aRect.size.width; params[1] = aRect.origin.y + aRect.size.height / 2; params[2] = aRect.origin.x + aRect.size.width; params[3] = aRect.origin.y + aRect.size.height / 2 * 0.445; params[4] = aRect.origin.x + aRect.size.width / 2 * 1.555; params[5] = aRect.origin.y; params[6] = aRect.origin.x + aRect.size.width / 2; params[7] = aRect.origin.y; params[8] = aRect.origin.x + aRect.size.width / 2 * 0.445; params[9] = aRect.origin.y; params[10] = aRect.origin.x; params[11] = aRect.origin.y + aRect.size.height / 2 * 0.445; params[12] = aRect.origin.x; params[13] = aRect.origin.y + aRect.size.height / 2; params[14] = aRect.origin.x; params[15] = aRect.origin.y + aRect.size.height /2 * 1.555; params[16] = aRect.origin.x + aRect.size.width / 2 * 0.445; params[17] = aRect.origin.y + aRect.size.height; params[18] = aRect.origin.x + aRect.size.width / 2; params[19] = aRect.origin.y + aRect.size.height; params[20] = aRect.origin.x + aRect.size.width / 2 * 1.555; params[21] = aRect.origin.y + aRect.size.height; params[22] = aRect.origin.x + aRect.size.width; params[23] = aRect.origin.y + aRect.size.height / 2 * 1.555; params[24] = aRect.origin.x + aRect.size.width; params[25] = aRect.origin.y + aRect.size.height / 2; } + (NSSize)calcSizeForInnerSize:(NSSize)aSize { return aSize; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.