I'd have to make some assumptions since you don't specify how you define slope. Either way you should be able to get a theta from the equation.
Here is an example that does what you require. It was a fun challenge to get it to work and it should get you started. Note: one thing that helped me was always keeping angles between -pi and pi. I also use vector projection to get the line that is drawn to look like it correctly lies on the slope.
package
{
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
public class CircleSnap extends Sprite
{
private static const DEG_TO_RAD:Number = (Math.PI / 180);
private static const RAD_TO_DEG:Number = (180 / Math.PI);
private static const centerPoint:Point = new Point(200, 200);
private static const RADIUS:int = 100;
private var slope:Number;
private var circle:Sprite;
private var line:Sprite;
public function CircleSnap()
{
addEventListener(Event.ADDED_TO_STAGE, addedToStage);
}
private function addedToStage(event:Event):void
{
// choose a random slope (between -Math.PI to Math.PI)
slope = (Math.random()*Math.PI*2) - Math.PI;
// draw the circle
circle = makeColoredCircle();
addChild(circle);
circle.x = centerPoint.x;
circle.y = centerPoint.y;
circle.rotation = slope * RAD_TO_DEG;
line = new Sprite();
addChild(line);
stage.addEventListener(MouseEvent.MOUSE_MOVE, drawLine);
}
private function drawLine(event:MouseEvent):void
{
line.graphics.clear();
// calculate the angle of the line
var lineAngle:Number = Math.atan2(
stage.mouseY - centerPoint.y,
stage.mouseX - centerPoint.x);
var angleDiff:Number = (lineAngle - slope);
if(Math.abs(angleDiff) > Math.PI)
{
// wrap the angle between -pi and pi
var angleDir:int = angleDiff > 0 ? -1 : 1;
angleDiff = (Math.PI*2 - Math.abs(angleDiff)) * angleDir;
}
// assume we just draw to the mouse position
var destX:Number = stage.mouseX;
var destY:Number = stage.mouseY;
// if we are in the top area of the circle
if(angleDiff < 0)
{
// calculate the length
var xDiff:Number = stage.mouseX - centerPoint.x;
var yDiff:Number = stage.mouseY - centerPoint.y;
// we use Math.cos here to project the new line onto the slope
var len:Number = Math.cos(angleDiff) * Math.sqrt(xDiff*xDiff+yDiff*yDiff);
destX = Math.cos(slope) * len + centerPoint.x;
destY = Math.sin(slope) * len + centerPoint.y;
}
// draw the line
line.graphics.lineStyle(3, 0x00FFFF);
line.graphics.moveTo(centerPoint.x, centerPoint.y);
line.graphics.lineTo(destX, destY);
}
private function makeColoredCircle():Sprite
{
var circle:Sprite = new Sprite();
var bottomHalf:Sprite = new Sprite();
circle.addChild(bottomHalf);
bottomHalf.graphics.beginFill(0xFF0000);
halfCircle(bottomHalf.graphics, 0, 0, RADIUS);
var topLeftQuarter:Sprite = new Sprite();
circle.addChild(topLeftQuarter);
topLeftQuarter.graphics.beginFill(0x00FF00);
quarterCircle(topLeftQuarter.graphics, 0, 0, RADIUS);
topLeftQuarter.rotation = 180
var topRightQuarter:Sprite = new Sprite();
circle.addChild(topRightQuarter);
topRightQuarter.graphics.beginFill(0x0000FF);
quarterCircle(topRightQuarter.graphics, 0, 0, RADIUS);
topRightQuarter.rotation = -90;
return circle;
}
// found this here: http://actionsnippet.com/?p=1515
private function halfCircle(g:Graphics, x:Number,y:Number,r:Number):void
{
var c1:Number=r * (Math.SQRT2 - 1);
var c2:Number=r * Math.SQRT2 / 2;
g.moveTo(x+r,y);
g.curveTo(x+r,y+c1,x+c2,y+c2);
g.curveTo(x+c1,y+r,x,y+r);
g.curveTo(x-c1,y+r,x-c2,y+c2);
g.curveTo(x-r,y+c1,x-r,y);
}
// modified from halfCircle found here: http://actionsnippet.com/?p=1515
private function quarterCircle(g:Graphics, x:Number,y:Number,r:Number):void
{
var c1:Number=r * (Math.SQRT2 - 1);
var c2:Number=r * Math.SQRT2 / 2;
g.moveTo(x+r,y);
g.curveTo(x+r,y+c1,x+c2,y+c2);
g.curveTo(x+c1,y+r,x,y+r);
g.lineTo(x, y);
}
}
}