dポイントプレゼントキャンペーン実施中!

C++Builder5にて以下の事をしたいのですがどうしたらいいのかがまったくわからず困っております。したい事は以下の通りです。

(1)FormにTImageを設定
(2)TImage上にマウスにて2点を設定します。
(3)2点の終点に矢印を作成
(4)両方の矢印の終点から2点間の線と並行になるように線を引く。
(5)(4)で引いた線の終端同士を線で結ぶ。
(6)(1)で2点間の角度を調べる

作成される図形としては鉛筆型の5角形を作成したいのですがどうしたらいいのでしょうか。
よろしくお願い致します。

A 回答 (3件)

質問の趣旨が理解できません。

(1)から(6)まで何度も読んでみたんですが。
質問は他人が読んで明確に意味が分かるような表現でお願いします。

とりあえず、「鉛筆型の5角形を作成」という言葉だけを手がかりにサンプルを示します。勘違いしてるようならご勘弁。その際は補足で詳細を明示してください。

2点の座標と鉛筆の太さは決め打ちしてます。また先端(芯の出ている方)の角度は90度としてます。
マウス操作で2点の座標を取得する方法は開発者ガイドの第10章に詳しいサンプルがあるのでそちらを参照してください。

#include <math.h>

 TPoint bottom( 10, 10 ), top( 100, 100 );
 int width = 20; //鉛筆の太さ

 double length = sqrt( //2点間の距離 これを鉛筆の長さにする
  pow( top.x - bottom.x, 2 ) + pow( top.y - bottom.y, 2 )
 );
 if ( length <= width ) return; //鉛筆型が書けないときは処理を中断

 //2点の座標から線分の傾き(ラジアン)を取得
 double rad = atan2( top.y - bottom.y, top.x - bottom.x );
 //x軸上に置いた場合の鉛筆の座標 先端から左回り
 TPoint points[] = {
  TPoint( length, 0 ),
  TPoint( length - width, width/2 ),
  TPoint( 0, width/2 ),
  TPoint( 0, -width/2 ),
  TPoint( length - width, -width/2 )
 };

 //座標の変換
 for ( int n=0; n<5; ++n ) {
  //座標を回転移動
  points[n] = TPoint(
   points[n].x*cos(rad) - points[n].y*sin(rad),
   points[n].x*sin(rad) + points[n].y*cos(rad)
  );
  //bottomを始点とする位置に移動
  points[n].x += bottom.x;
  points[n].y += bottom.y;
 }
//描画
 Image1->Canvas->Polygon( points, 4 );



以上、とりあえず処理の流れを示すサンプルですから、かなり大雑把なもので精度は良くないです。

また、言うまでもないですが、これはあくまで私が思いついたサンプルコードです。
これ以外にももっとスマートなコードが考えられるでしょう。
ご自分で色々と研究してください。

この回答への補足

確かに読み返して見るとよくわからない手順になってました。
申し訳ございません。

再度手順を記載します。

手順1:マウスにて始点となる座標をクリック
手順2:マウスにて終点となる座標をクリック
手順3:終点になった座標から左右に30度開いた線を長さ20で線を引く
(ここで矢印の<が作成される)
手順4:矢印を書いた左右それぞれの終点の座標と手順1、手順2で結んだ
線と平行に始点と垂直になる箇所まで線を引く
手順5:手順4で引かれた線の終点同士をせんで結ぶ
(こうすると鉛筆型の5角形が出来ると考えております)

少しは理解して頂けたでしょうか。
説明が上手くなくご迷惑おかけします。

参考に質問にいたった経緯としては、
始点と終点をを指定したら5角形を作成出来るようにして欲しいと言われ、どうしたらいいのかわからずここでいろいろみて調べていたら
『QNo.57865で矢印を描画するには』という質問に
haru-pさんがサンプルを作成しているプログラムを見て、これを参考にしたら言われた事が出来るのでは??と思ったのですが出来なかったので質問させて頂いた次第です。

参考にしたURLは以下の通りです。
http://kikitai.teacup.com/kotaeru.php3?q=57865

補足日時:2006/08/02 17:43
    • good
    • 0

>開発者ガイド


C++Builder付属のマニュアルです。
Personal版にはついてなかったかな?
その場合でもヘルプには収録されています。読みにくいですが。
ラバーバンドのあたりを参考にすると良いかと。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
C++Builder付属のマニュアルは紛失してしまったので
ヘルプを参考にして勉強致します。

お礼日時:2006/08/04 08:04

最終的な目的は、鉛筆型5角形を描画することなのでしょうか?


それとも、任意の5角形を描画することなのでしょうか?

鉛筆型5角形ならNo.1のサンプルコードを手直しすればすみます。
No.1補足の仕様であれば、回転前の5角形の各頂点の座標を手直しすればよいはずです。
※マウスで2点の座標を取得する方法は開発者ガイドを参照するということで。

任意の5角形なら別の発想でコーディングする必要がありそうです。

この回答への補足

最終的な目的は鉛筆型の5角形が描画できるこですので、先日作成して頂いたサンプルソフトを手直ししてしたい事は出来るようになりました。
本当にありがとうございました。
ちなみに開発者ガイドってどこにあるのでしょうか?
URLをご教示いただけると幸いです。

補足日時:2006/08/03 08:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!