This is DualView.m in view mode; [Download] [Up]
// DualView.m #import "DualView.h" #import "Controller.h" #import <stdio.h> @implementation DualView - mouseDown: (NXEvent *)event { NXPoint mouseLocation; mouseLocation = event->location; [self convertPoint:&mouseLocation fromView:nil]; mouseLocation.x = xMin + mouseLocation.x / bounds.size.width * (xMax - xMin); mouseLocation.y = yMin + mouseLocation.y / bounds.size.height * (yMax - yMin); [controller addDual:mouseLocation]; return self; } #define X(x) ((x - xMin) * sx) #define Y(y) ((y - yMin) * sy) - drawSelf:(const NXRect *)rects :(int)rectCount { PointLine *primalPoint, *primalLine; int numberOfPrimalPoints, numberOfPrimalLines; int i; float sx = bounds.size.width / (xMax - xMin); float sy = bounds.size.height / (yMax - yMin); [super drawSelf:rects :rectCount]; // draw dual lines (from primal points) // primal line y = ax - b <=> (a,b) [controller getPrimalPoints:&numberOfPrimalPoints :&primalPoint]; for (i = 0; i < numberOfPrimalPoints; i++) { float x = xMin; float y = x * primalPoint[i].a - primalPoint[i].b; int dy = 0; // used to adjust the position of the line label if (y < yMin && primalPoint[i].a) { y = yMin; x = (y + primalPoint[i].b) / primalPoint[i].a; } else if (y > yMax && primalPoint[i].a) { y = yMax; x = (y + primalPoint[i].b) / primalPoint[i].a; dy = -12; } NXSetColor(primalPoint[i].color); if ([showLabels state]) { PSmoveto(X(x), Y(y) + dy); PSshow(primalPoint[i].label); } PSmoveto(X(x), Y(y)); PSlineto(X(xMax), Y(xMax * primalPoint[i].a - primalPoint[i].b)); PSstroke(); } // draw dual point (from primal lines) // primal point (a,b) <=> y = ax - b [controller getPrimalLines:&numberOfPrimalLines :&primalLine]; for (i = 0; i < numberOfPrimalLines; i++) { NXSetColor(primalLine[i].color); if ([showLabels state]) { PSmoveto(X(primalLine[i].a), Y(-primalLine[i].b)); PSshow(primalLine[i].label); } PSnewpath(); PSarc(X(primalLine[i].a), Y(-primalLine[i].b), 2.0, 0.0, 360.0); PSfill(); } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.