This is MiscVerticalTriangleShape.m in view mode; [Download] [Up]
/* MiscVerticalTriangleShape.m Copyright 1996 Uwe Hoffmann. This notice may not be removed from this source code. The use and distribution of this software is governed by the terms of the MiscKit license agreement. Refer to the license document included with the MiscKit distribution for the terms. Version 2 (August 1996) */ #import <Foundation/Foundation.h> #import "MiscVerticalTriangleShape.h" #import "MiscUserPath.h" #import "MiscTDUtils.h" @implementation MiscVerticalTriangleShape - (NSRect)innerBounds { NSRect ir,b; b = [path bounds]; ir.origin.x = b.origin.x + b.size.width / 4; if(!vR) ir.origin.y = b.origin.y; else ir.origin.y = b.origin.y + b.size.height / 2; ir.size.width = b.size.width / 2; ir.size.height = b.size.height / 2; return ir; } - (MiscShapeType)shapeType { return MiscVerticalTriangleShapeType; } - (void)calcIntersection:(NSPoint *)ip angle:(float *)alpha toPoint:(NSPoint)aPoint { NSPoint middle,l1,l2,pos; float s,ausdruck,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){ ip->y = middle.y; if(aPoint.x > middle.x){ *alpha = 0; ip->x = middle.x + width / 4; } else { *alpha = 180; ip->x = pos.x + width / 4; } 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(!vR){ if(aPoint.y > middle.y){ if(aPoint.x > middle.x){ // I. quadrant l1.x = middle.x; l1.y = pos.y + height; l2.x = middle.x + width / 4; l2.y = middle.y; ausdruck = (l2.y - l1.y) / (l2.x - l1.x); ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s); ip->y = middle.y + s * (ip->x - middle.x); } else { // II. quadrant l1.x = middle.x; l1.y = pos.y + height; l2.x = middle.x - width / 4; l2.y = middle.y; ausdruck = (l2.y - l1.y) / (l2.x - l1.x); ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s); ip->y = middle.y + s * (ip->x - middle.x); *alpha += 180; } } else { if(aPoint.x > middle.x){ // IV. quadrant l1.x = middle.x + width / 4; l1.y = middle.y; l2.x = pos.x + width; l2.y = pos.y; if(miscTD_straddles(l1, l2, middle, aPoint)){ ausdruck = (l2.y - l1.y) / (l2.x - l1.x); ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s); ip->y = middle.y + s * (ip->x - middle.x); } else { ip->y = pos.y; ip->x = middle.x + (ip->y - middle.y) / s; } } else { // III. quadrant l1.x = middle.x - width / 4; l1.y = middle.y; l2.x = pos.x; l2.y = pos.y; if(miscTD_straddles(l1, l2, middle, aPoint)){ ausdruck = (l2.y - l1.y) / (l2.x - l1.x); ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s); ip->y = middle.y + s * (ip->x - middle.x); } else { ip->y = pos.y; ip->x = middle.x + (ip->y - middle.y) / s; } *alpha += 180; } } } else { if(aPoint.y > middle.y){ if(aPoint.x > middle.x){ // I. quadrant l1.x = middle.x + width / 4; l1.y = middle.y; l2.x = pos.x + width; l2.y = pos.y + height; if(miscTD_straddles(l1, l2, middle, aPoint)){ ausdruck = (l2.y - l1.y) / (l2.x - l1.x); ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s); ip->y = middle.y + s * (ip->x - middle.x); } else { ip->y = pos.y + height; ip->x = middle.x + (ip->y - middle.y) / s; } } else { // II. quadrant l1.x = middle.x - width / 4; l1.y = middle.y; l2.x = pos.x; l2.y = pos.y + height; if(miscTD_straddles(l1, l2, middle, aPoint)){ ausdruck = (l2.y - l1.y) / (l2.x - l1.x); ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s); ip->y = middle.y + s * (ip->x - middle.x); } else { ip->y = pos.y + height; ip->x = middle.x + (ip->y - middle.y) / s; } *alpha += 180; } } else { if(aPoint.x > middle.x){ // IV. quadrant l1.x = middle.x; l1.y = pos.y; l2.x = middle.x + width / 4; l2.y = middle.y; ausdruck = (l2.y - l1.y) / (l2.x - l1.x); ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s); ip->y = middle.y + s * (ip->x - middle.x); } else { // III. quadrant l1.x = middle.x; l1.y = pos.y; l2.x = middle.x - width / 4; l2.y = middle.y; ausdruck = (l2.y - l1.y) / (l2.x - l1.x); ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s); ip->y = middle.y + s * (ip->x - middle.x); *alpha += 180; } } } } - (void)makePathWithBounds:(NSRect)aRect { if(!vR){ [path moveto:aRect.origin.x :aRect.origin.y]; [path rlineto:aRect.size.width / 2 :aRect.size.height]; [path rlineto:aRect.size.width / 2 :-aRect.size.height]; } else { [path moveto:aRect.origin.x :aRect.origin.y + aRect.size.height]; [path rlineto:aRect.size.width / 2 :-aRect.size.height]; [path rlineto:aRect.size.width / 2 :aRect.size.height]; } [path closepath]; } - (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; if(!vR){ params[0] = aRect.origin.x; params[1] = aRect.origin.y; params[2] = aRect.size.width / 2; params[3] = aRect.size.height; params[4] = aRect.size.width / 2; params[5] = -aRect.size.height; } else { params[0] = aRect.origin.x; params[1] = aRect.origin.y + aRect.size.height; params[2] = aRect.size.width / 2; params[3] = -aRect.size.height; params[4] = aRect.size.width / 2; params[5] = aRect.size.height; } } + (NSSize)calcSizeForInnerSize:(NSSize)aSize { NSSize os; os.width = aSize.width * 2; os.height = aSize.height * 2; return os; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.