Interview
Vor langer Zeit habe ich viele Kandidaten für viele Stellen als Grafikprogrammierer interviewt. Ein guter Interviewer zu sein ist harte Arbeit; Meine ersten Versuche waren nicht großartig. Im Laufe der Zeit kam mir diese Frage in den Sinn, um ein Gespräch anzustoßen.
Ich: Was machen Sie, wenn ein Kollege zu Ihnen kommt und sagt: „Ich muss einen Kreis zeichnen?“
- Kandidat 0: Ich weiß es nicht.
- Kandidat 1: Ich weiß es nicht. Ein Kompass?
- Kandidat 2: Hmmmm. Ich würde einen kleinen Buchstaben „o“ drucken.
- Kandidat 3: Quadratwurzel sollte es tun.
- Kandidat 4: Sinus und Cosinus sollten es tun.
- Kandidat 5: Der Kreiszeichnungsalgorithmus von Bresenham sollte es schaffen.
- Kandidat 6: Ich würde ihnen sagen, sie sollen nach einer Bibliotheksfunktion suchen und ihnen zeigen, wo sich die Dokumentation befindet. Lieber wiederverwenden als erfinden.
- Kandidat 7: Ich würde sagen: „Ich weiß es nicht.“ Warum möchten Sie einen Kreis zeichnen?“ weil sie vielleicht gar keinen zeichnen müssen. Vielleicht müssen sie anhand der Quadratwurzel wissen, was sich innerhalb des Kreises befindet. Vielleicht brauchen sie eine Ellipse. Wenn wir entscheiden, dass ein gezeichneter Kreis wirklich benötigt wird, wo wird er dann gezeichnet? Wird es gefüllt, einfarbig oder mit einem Muster sein? Die Chancen stehen gut, dass es dafür bereits eine Funktion gibt, die inzwischen gut debuggt ist. Sie müssen es wahrscheinlich nicht selbst schreiben, aber wenn Sie es tun, verwenden Sie Sinus- und Cosinuswerte und machen Sie die Schrittgröße zu einer Funktion des Radius. Wie schnell muss es sein? Je nach Gerät könnte Bresenham geeignet sein. Auf einem Drucker könnte ein kleiner Buchstabe „o“ als Marker funktionieren und ausreichen.
Diskussion
Die Kandidaten 0,1,2,3,4,5 haben alle den Wald verpasst. Wenn Sie der Interviewer sind, helfen Sie ihm unbedingt, die andere Person in der Frage zu erkennen, denn das ist die Hälfte der Frage. Und wenn Sie der Kandidat sind, achten Sie auf zweiteilige Fragen.
Wenn Sie der Interviewpartner sind, hören Sie nie dort auf, wo Kandidat 0 es getan hat. Die Kandidaten 1 und 2 bieten dem Interviewer gerade genug Aufschluss, um eine weitere Frage zu stellen. Wenn Sie der Interviewer sind, denken Sie daran, dass sich der Kandidat in einer Stresssituation befindet und ein wenig Hilfe benötigt, um weitere Details herauszufinden.
Die Kandidaten 3, 4 und 5 schlagen jeweils eine technische Lösung vor, von denen jede funktionieren könnte, aber keine davon ist immer die beste. Wenn Sie der Kandidat sind, sprechen Sie weiter über Ihre Antwort. Wenn Sie der Interviewer sind, coachen Sie ihn: „Wird das (schnell, sicher, korrekt usw.) sein?“
Die Kandidaten 6 und 7 liegen auf der pragmatischen Skala an unterschiedlichen Stellen. Weitere Fragen und Diskussionen sind erforderlich, um die beste Lösung zu ermitteln.
Antworten
Bei der Interviewfrage geht es nicht wirklich darum, einen Kreis zu zeichnen, aber wenn Sie deshalb immer noch lesen, finden Sie hier JSL für die Antworten 2,3,4,5,6.
Kleinbuchstabe o, drei Möglichkeiten
New Window( "Candidate 2, literal",
Graph Box(
xaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
yaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
Text( Center Justified, {50, 50}, "o" ) // "o" sits above the point
)
);
Text sits above the baseline.Der Text befindet sich über der Grundlinie.
New Window( "Candidate 2, modified",
Graph Box(
xaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
yaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
markersize(10),
marker( markerstate("O"), {50, 50}) // capital "O" is somewhat centered
)
);
Using a marker with a capital O.Verwenden Sie einen Marker mit einem großen O.
New Window( "Candidate 2, reinvented",
Graph Box(
xaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
yaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
Marker Size( 100 ),
Marker( Marker State( 8 ), {50, 50} ) // bigger is thicker
)
);
If you can use a marker, then you can pick the circle symbol.Wenn Sie einen Marker verwenden können, können Sie das Kreissymbol auswählen.
Quadratwurzel, zwei Möglichkeiten
New Window( "Candidate 3, sqrt hard way",
Graph Box(
framesize( 300, 300 ),
xaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
yaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
// draw a circle at 50,50 with radius 30 using sqrt
// a lot of code, and not too pretty on the left and right
step=3; // to make the problem more obvious, use 1 to almost hide it
For( x = 0, x < 30, x += step,
// hyp = sqrt(x^2 + y^2)
// hyp^2 = x^2 + y^2
// hyp^2 - x^2 = y^2
y1 = Sqrt( 30 ^ 2 - x ^ 2 );
y2 = Sqrt( 30 ^ 2 - (x + step) ^ 2 );
// do all four quadrants in parallel
Line( {50 + x, 50 + y1}, {50 + (x + step), 50 + y2} );
Line( {50 - x, 50 + y1}, {50 - (x + step), 50 + y2} );
Line( {50 - x, 50 - y1}, {50 - (x + step), 50 - y2} );
Line( {50 + x, 50 - y1}, {50 + (x + step), 50 - y2} );
)
)
);
The sqrt approach looks rough on the left and right because of the equal-sized steps in x.Der sqrt-Ansatz sieht aufgrund der gleich großen Schritte in x links und rechts grob aus.
New Window( "Candidate 3, sqrt with YFunction",
Graph Box(
framesize( 300, 300 ),
xaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
yaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
// draw a circle at 50,50 with radius 30 using sqrt
// sqrt has two answers. Looks nice, thanks YFunction. Only a small gap.
Y Function( 50 + Sqrt( 30 ^ 2 - (x - 50) ^ 2 ), x );// top
Y Function( 50 - Sqrt( 30 ^ 2 - (x - 50) ^ 2 ), x );// bottom
)
);
The Y Function adjusts the x step size automatically.Die Y-Funktion passt die x-Schrittgröße automatisch an.
Sinus und Cosinus
New Window( "Candidate 4, sin/cos with XYFunction",
Graph Box(
framesize( 300, 300 ),
xaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
yaxis( Add Ref Line( 50, "Solid", "Black", "", 1 ) ),
// draw a circle at 50,50 with radius 30 using sin/cos
XY Function( 50 + 30 * Cos( t ), 50 + 30 * Sin( t ), t, Min( 0 ), Max( 2 * Pi() ) )
)
);
I really like the XYFunction for this parametric description of a circle.Mir gefällt die XYFunction für diese parametrische Beschreibung eines Kreises sehr gut.
Bresenham
//Bresenham.
// using pixel functions (There is no reason I can think of to
// use this code; everything else will be faster! A long time
// ago there was no floating point arithmetic or sin/cos/sqrt
// and tricks like this were useful.)
drawCircle = Function( {xc, yc, x, y}, // not really pixels. this is not a good match for JMP!
Marker( Marker State( 0 ), {xc + x, yc + y} ); // invented for primitive hardware without
Marker( Marker State( 0 ), {xc - x, yc + y} ); // floating point.
Marker( Marker State( 0 ), {xc + x, yc - y} );
Marker( Marker State( 0 ), {xc - x, yc - y} );
Marker( Marker State( 0 ), {xc + y, yc + x} );
Marker( Marker State( 0 ), {xc - y, yc + x} );
Marker( Marker State( 0 ), {xc + y, yc - x} );
Marker( Marker State( 0 ), {xc - y, yc - x} );
);
circleBres = Function( {xc, yc, r}, // https://www.geeksforgeeks.org/bresenhams-circle-drawing-algorithm/
x = 0;
y = r;
d = 3 - 2 * r;
drawCircle( xc, yc, x, y );
While( y >= x,
x++;
If( d > 0,
y--;
d = d + 4 * (x - y) + 10;
,
d = d + 4 * x + 6
);
drawCircle( xc, yc, x, y );
);
);
New Window( "Candidate 5, really hard way using pixels",
Graph Box(
framesize( 900, 900 ),xscale(0,1000),yscale(0,1000),
xaxis( Add Ref Line( 500, "Solid", "Black", "", 1 ) ),
yaxis( Add Ref Line( 500, "Solid", "Black", "", 1 ) ),
// draw a circle at 500,500 with radius 300
circleBres( 500, 500, 300 ),
text({300,700},"Zoom in for detail")
)
);
The point of the Bresenham circle drawing algorithm is to only use integers and avoid multiply and divide ( *2 and *4 can be shift operations.)Der Sinn des Bresenham-Kreiszeichnungsalgorithmus besteht darin, nur ganze Zahlen zu verwenden und Multiplikationen und Divisionen zu vermeiden ( *2 und *4 können Verschiebungsoperationen sein.)
Zoomed in the pixels always step in either x or y or both.Vergrößert werden die Pixel immer entweder in x- oder y-Schritten oder in beiden Schritten.
Bibliotheksfunktionen
New Window( "Candidate 6, Circle Function",
Graph Box(
xaxis( Show Major Grid( 1 ) ),
yaxis( Show Major Grid( 1 ) ),
Circle( {50, 50}, 30 )
)
);
The Circle Function uses the Y dimension and makes a visibly round circle. Because the axes are not isometric, something seems odd.Die Kreisfunktion nutzt die Y-Dimension und erstellt einen sichtbar runden Kreis. Da die Achsen nicht isometrisch sind, erscheint etwas seltsam.
New Window( "Candidate 6, Circle on square paper",
Graph Box( framesize(400,400),
xaxis( Show Major Grid( 1 ) ),
yaxis( Show Major Grid( 1 ) ),
Circle( {50, 50}, 30 )
)
);
The graph's popup menu, Size/Scale->SizeToIsometric will automatically make this adjustment.Das Popup-Menü des Diagramms, Größe/Skalierung->SizeToIsometrische, nimmt diese Anpassung automatisch vor.
Möglicherweise bevorzugen Sie die ovale Funktion:
New Window( "Candidate 6, Oval function",
Graph Box( // framesize(600,400),
x=50;
y=50;
r=30;
Oval( x-r, y-r, x+r, y+r );
)
);
The Oval function has a clear API for the vertical and horizontal dimensions.Die Oval-Funktion verfügt über eine klare API für die vertikalen und horizontalen Abmessungen.
Hydraulik
I traced a DVD; the cyborg hand is really teaching about hydraulics and levers and putting pieces together.Ich habe eine DVD verfolgt; Die Cyborg-Hand lehrt wirklich etwas über Hydraulik und Hebel und das Zusammensetzen von Teilen.
Ich habe den Januar und Februar damit verbracht, einem Fünfjährigen beim Zusammenbau dieser Mega-Cyborg-Hand zu helfen. Ich würde sieben als angemessenes Mindestalter empfehlen (wie auch die Box); Wir machten etwa jeden zweiten Tag 10- bis 15-minütige Sitzungen. Es ist ein erstaunlicher Wert für etwa 30 $. Das Beste: Als ich neulich nach Hause ging, entdeckte der Fünfjährige einen Bagger und erzählte mir von den Hydraulikzylindern.
Huge! Actually too big for a five year old.Riesig! Eigentlich zu groß für einen Fünfjährigen.