>円が直線にぶつかっていれば1,ぶつかっていなければ0を返す
のであれば
if(d<=r)lflag=1;
else lflag=0;
ではないでしょうか(d と r が逆)。
線分と円の当たり判定は、直線との当たり判定をしなくても、線分と点の距離を求めた上で半径との大きさを比較すればいけます。
// (ax,ay)-(bx,by) の線分と (cx,cy) との距離の平方を返す
double SqDistPointSegment(double ax, double ay, double bx, double by, double cx, double cy)
{
double abx = bx - ax;
double aby = by - ay;
double acx = cx - ax;
double acy = cy - ay;
// 点(acx,acy) を線分 (0,0)-(abx,aby) を通る直線上へ射影する(内積を求める)
double e = abx * acx + aby * acy;
// 線分の外側だった場合は、(ax,ay)-(cx,cy) 間の距離を求めるか、(bx,by)-(cx,cy) 間の距離を求める
if (e <= 0.0f)
{
return acx * acx + acy * acy;
}
double f = abx * abx + aby * aby;
if (e >= f)
{
double bcx = cx - bx;
double bcy = cy - by;
return bcx * bcx + bcy * bcy;
}
// 線分の内側にある場合、(ax,ay)-(cx,cy) 間の距離と (bx,by)-(cx,cy) 間の距離(つまり f)と、
// e から求めることができる
return acx * acx + acy * acy - e * e / f;
}
int SegmentHitCircle(double x1, double y1, double x2, double y2, double p, double q, int r)
{
double sd = SqDistPointSegment(x1, y1, x2, y2, p, q);
// 線分と点の距離(の平方)が半径(の平方)より小さければ当たっている
return sd < r * r;
}