質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

C++でプログラムを書いています。 boostを使わないように書き換えたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,013

aya5e85

score 11

前提・実現したいこと

C++でプログラムを書いています。
以下のプログラム書き換えたいのです。
boostを使わずのやることはできないでしょうか?
(何度も試したのですがビルドできませんでした...)

やりたいことはinput.txt内にGコードが入っており、XとYの値を別々に配列に格納するためのものです。
(例)
X0.027Y0.008
X0.028Y0.007
X0.028Y0.004
X0.029Y0.003
X0.028
X9.315
X-9.315
X-0.028Y0.002
X-0.029Y0.003


この場合、Yの数値がない配列は1つ前のY配列の数値を代入します。(Xも同様)

ご存知の方がいらっしゃいましたら教えていただきたいです。
よろしくお願いします。

include <iostream>

include <iomanip>

include <string>

include <stdexcept>

include <cctype>

include <vector>

include <fstream>

include <boost/geometry.hpp>

include <boost/geometry/geometries/point_xy.hpp>

include <boost/geometry/geometries/register/point.hpp>

include <boost/geometry/geometries/adapted/boost_tuple.hpp>

include <boost/geometry/geometries/adapted/boost_polygon/point.hpp>

using point2i = boost::geometry::model::d2::point_xy<int>;

point2i make_point_from_string(std::string s, const point2i& last_p)
{
bool missing_x = false;
point2i re;
if ('x' != std::tolower(s[0])) {
missing_x = true;
}
else {
s.erase(0, 1);//pop_front
std::size_t y_front_pos = 0;
re.x(std::stoi(s, &y_front_pos));
s.erase(0, y_front_pos);
}
if ('y' != std::tolower(s[0])) {
if (missing_x) throw std::invalid_argument("unexpected input detect.");
re.y(last_p.y());
return re;
}
s.erase(0, 1);//pop_front
re.y(std::stoi(s));
return re;
}
std::vector<point2i> read_points(std::istream& is)
{
std::vector<point2i> re;
for (std::string buf; std::getline(is, buf); ) {
re.push_back(make_point_from_string(std::move(buf), (re.empty()) ? point2i{} : re.back()));
}
return re;
}
void calc_distance_and_output(std::ostream& os, const std::vector<point2i>& points)
{
for (std::size_t i = 0; i < points.size() - 1; ++i) {
os << std::fixed << boost::geometry::distance(points[i], points[i + 1]) << std::endl;
}
}
int main()
{
std::ifstream file("input.txt");
const auto points = read_points(file);
calc_distance_and_output(std::cout, points);
}

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ここにご自身が実行したソースコードを書いてください

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • PineMatsu

    2017/02/07 16:45 編集

    「ここにご自身が実行したソースコードを書いてください」と書いてあるところにコードを挿入してください。つまり```~```で囲まれたブロックです。あと。開発環境などツールのバージョンも書いてください。

    キャンセル

  • t_obara

    2017/02/07 16:56

    確認です、Boostを利用市内で実現できるか否かという質問であれば、できるの一言で済みます。具体的に教えてくれという場合、ただの教えてくんじゃなくて、自分で考えたところを見せろって言われそうですが、さてアタなの質問は何を期待しているのでしょうか?

    キャンセル

回答 1

checkベストアンサー

+2

こんにちは。

boostを使わずのやることはできないでしょうか? 

できますし、それほどたいへんでもなさそうに見えます。

boostを使っている部分は、point2iとboost::geometry::distance()だけですね。
point2iは単にint型変数x, yを持つ構造体で十分な印象です。
distance()は恐らく2点間の距離でしょう。
普通に2点間の距離の公式で計算できると思います。

ですので、point2iを普通に構造体で定義してトライしてみて下さい。
その結果、うまくいかなかった場合、そのソースを提示されると良いと思います。(その際、<code>を押して出て来る'''の間にソースを貼り付けて下さい。できれば現在のソースもインデントが付いた形で同様に修正した方が良いです。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる