R2021aを使用し​て、直線と円弧の交​​点を求める関数はあり​ますか?

조회 수: 29 (최근 30일)
HO
HO 2021년 7월 29일
편집: Atsushi Ueno 2021년 8월 3일
R2021aを使用し、直線から円弧の外側のライン上を順に移動する円の交点を求める方法を教えてください。
A点からA’点に円が移動するとき、円の交点BやB’の交点、さらにC点やC’点を求める関数や方法はありますか?
  댓글 수: 3
HO
HO 2021년 7월 29일
説明不足で申し訳ございません。
A点を中心とする円は、中心が実線(青)のライン上を右から左側に動くものとイメージください。その動作の各ポイント時に、この円に接するBの位置を求めたいと考えております。よって、構成は3つの種類があります。
1,A点が直線上にある時のカーブ上にあるBの位置
2,A点がカーブ上にある時のカーブ上にあるBの位置
3,A点がカーブ上にある時の直線上にあるB点の位置
この円に交わる交点(B点)の場所を求める方法があればと考えております。
Atsushi Ueno
Atsushi Ueno 2021년 7월 29일

댓글을 달려면 로그인하십시오.

채택된 답변

Atsushi Ueno
Atsushi Ueno 2021년 7월 29일
편집: Atsushi Ueno 2021년 8월 3일
を使いました。変数stepの値とpause(0.05)の時間を変更すれば、変化の粗さや表示速度を調整できます。
BとCは同心円なので単に角度から対応する座標を求めました。
step = 5; llen = 20;
xb = 0; yb = 0; rb = 12;
xc = 0; yc = 0; rc = 8;
xa = rb; ya = 0; ra = 15;
figure;
for ya = -llen:step:0 % 直線部
draw_path(xb,yb,rb,xc,yc,rc,llen);
draw_intersec(xa,ya,ra,xb,yb,rb,xc,yc,rc);
end
for th = 0:step/rb:pi % 円弧部
xa = xb + rb * cos(th);
ya = yb + rb * sin(th);
draw_path(xb,yb,rb,xc,yc,rc,llen);
draw_intersec(xa,ya,ra,xb,yb,rb,xc,yc,rc);
end
xa = -rb;
for ya = 0:-step:-5 % 直線部
draw_path(xb,yb,rb,xc,yc,rc,llen);
draw_intersec(xa,ya,ra,xb,yb,rb,xc,yc,rc);
end
%% 以下はサブルーチン化した関数
function draw_path(xb,yb,rb,xc,yc,rc,llen) % 軌跡を描く
arc(xb,yb,rb,1,'--');
xlim([-30 30]); ylim([-35 30]); xlim manual; ylim manual; hold on;
arc(xc,yc,rc,1,'--');
line([xb+rb xb+rb],[yb yb-llen],'LineStyle','--');
line([xb-rb xb-rb],[yb yb-llen],'LineStyle','--');
line([xc+rc xc+rc],[yc yc-llen],'LineStyle','--');
line([xc-rc xc-rc],[yc yc-llen],'LineStyle','--');
end
function draw_intersec(xa,ya,ra,xb,yb,rb,xc,yc,rc) % 円と交点を描く
[crs1x,crs1y] = circcirc(xb,yb,rb,xa,ya,ra); % 外側経路の円弧部(円B)と円Aの交点
[crs2x,crs2y] = linecirc(inf,-rb,xa,ya,ra); % 外側経路の左側直線部と円Aの交点
if (crs1x(1) < 0) && (crs1y(1) > 0)
crs1x(2) = []; crs1y(2) = [];
crs2x(crs2y>0) = []; crs2y(crs2y>0) = []; % 線対円: y座標が負の交点に絞る(NaNは残す)
[crs2y index] = sort(crs2y,'descend');
crs2x = crs2x(index); % 線対円: y座標の降順でソート (NaNは残す)
else
crs1x(crs1y<0) = []; crs1y(crs1y<0) = []; % 円対円: y座標が正の交点に絞る(NaNは残す)
crs2x(crs2y>0) = []; crs2y(crs2y>0) = []; % 線対円: y座標が負の交点に絞る(NaNは残す)
[crs1x index] = sort(crs1x,'ascend');
crs1y = crs1y(index); % 円対円: x座標の昇順でソート (NaNは残す)
[crs2y index] = sort(crs2y,'descend');
crs2x = crs2x(index); % 線対円: y座標の降順でソート (NaNは残す)
end
if isempty(crs2x) || any(isnan(crs2x)) % 線対円がNaN or y<=0の交点が無い
crsxb = crs1x; crsyb = crs1y; % 円対円の交点を採用(NaNでもOK)
else
crsxb = crs2x; crsyb = crs2y; % 線対円の交点を採用(NaNでもOK)
end
theta = atan2(crsyb,crsxb); % 円B上の交点の角度を求める
crsxc = xc + rc * cos(theta); % 円c上の交点を上記角度から求める
crsyc = yc + rc * sin(theta);
arc(xa,ya,ra,2,'-'); % 円Aを描画
plot(crsxb,crsyb,'*'); % 円B上の交点を描画
plot(crsxc,crsyc,'+'); % 円C上の交点を描画
line([xa crsxb],[ya crsyb]); % 円Aの中心と円B上の交点を線で結ぶ
pause(0.05); hold off;
end
function arc(x,y,r,rsw,linestyle) % rsw=1:半円を描く、rsw=2:円を描く
ang=0:0.01:rsw*pi;
xp=r*cos(ang);
yp=r*sin(ang);
plot(x+xp,y+yp,linestyle);
end
  댓글 수: 8
HO
HO 2021년 8월 3일
円対円の交点を1つに絞ることが何とか出来ました。洗練されてなくお恥ずかしいですが、if (crs1x(1) < 0) && (crs1y(1) > 0)でx座標が負でy座標が正の条件を追加しました。現象を確認で来るところまで準備をして頂いたおかげです。誠にありがとうございます。残りは最後の直線部分で交点を2つ見つけてしまうところがあるので、こちらも条件を付けて絞りたいと思います。
HO
HO 2021년 8월 3일
편집: HO 2021년 8월 3일
最後の直線部分で交点を2つになる件に関して、AB間以上の長さは必要ないというか、AB間以上は全て直線上なので、ここはstepのendを-5にすることにしました。
for ya = 0:-step:-20 %  ーー> for ya = 0:-step:-5 % 直線部

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

HO
HO 2021년 7월 30일
편집: HO 2021년 7월 30일
アニメーションが確認出来ました。ありがとうございます。こちらを動作させますと動作する円が円弧上で2点の交点を持った際に先行を走るB点と円の中心のA点のラインが、2点の交点に切り替わることが確認できました。また、すでにお気付きの後半部分で円の中心A点から円の接する直線上のB点が上手く表現できてないことも確認ができました。この図形の縦横のスケールが動作しないようにしたいのですが可能でしょうか?
  댓글 수: 4
HO
HO 2021년 8월 2일
>functionを実行し、一回目に帰ってくる引数が”[]”のようなカッコ(空)でした。どうしてfunctionを実行し、一回目はのそのような引数になるのでしょうか?今は”isempty(crsxb)”で空かを確認して格納タイミングを取っています。
こちらですが、最初はA点もB点も直線上にいるため値が引数がないと言う理解で合っているでしょうか?
Atsushi Ueno
Atsushi Ueno 2021년 8월 2일
>最初はA点もB点も直線上にいるため値が引数がないと言う理解で合っているでしょうか?
多分あってます。交点が無ければlinecircやcirccirc関数はNaNを返すので値が空になります

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Traveling Salesman (TSP)에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!