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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

Q&A

解決済

1回答

2674閲覧

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

aya5e85

総合スコア13

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

0グッド

0クリップ

投稿2017/02/07 07:38

###前提・実現したいこと
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/ツール等のバージョンなど)
より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2017/02/07 07:47 編集

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

2017/02/07 07:56

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

回答1

0

ベストアンサー

こんにちは。

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

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

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

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

投稿2017/02/07 09:53

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問