Untitled
unknown
rust
3 years ago
2.2 kB
12
Indexable
use serde_json::Value;
use std::fs::File;
use std::io::{BufReader, Write};
fn fix_points(points: &mut Vec<(f64, f64)>) {
let mut s = 0.0;
for i in 0..points.len() {
let (px, py) = points[i];
let (qx, qy) = points[(i + 1) % points.len()];
s += (qx - px) * (qy + py);
}
if s < 0.0 {
points.reverse();
}
}
fn main() -> Result<(), std::io::Error> {
let args: Vec<String> = std::env::args().collect();
if args.len() != 3 {
eprintln!("Usage: {} <input_file> <output_file>", args[0]);
std::process::exit(1);
}
let in_name = &args[1];
let out_name = &args[2];
let in_file = File::open(in_name)?;
let reader = BufReader::new(in_file);
let json: Value = serde_json::from_reader(reader)?;
let mut out_file = File::create(&out_name)?;
for layer in json["layers"].as_array().unwrap() {
let name = layer["name"].as_str().unwrap();
if name == "walls" {
for o in layer["objects"].as_array().unwrap() {
let mut points = Vec::new();
let x = o["x"].as_f64().unwrap();
let y = o["y"].as_f64().unwrap();
for p in o["polygon"].as_array().unwrap() {
let px = p["x"].as_f64().unwrap();
let py = p["y"].as_f64().unwrap();
points.push((x + px, y + py));
}
fix_points(&mut points);
let s = points
.iter()
.map(|(x, y)| format!("({} {})", x, y))
.collect::<Vec<_>>()
.join(" ");
out_file
.write_all(format!("wall [{}]\n", s).as_bytes())
.unwrap()
}
} else if name == "objects" {
for o in layer["objects"].as_array().unwrap() {
let name = o["name"].as_str().unwrap();
let x = o["x"].as_f64().unwrap();
let y = o["y"].as_f64().unwrap();
out_file
.write_all(format!("{} ({} {})\n", name, x, y).as_bytes())
.unwrap()
}
}
}
Ok(())
}
Editor is loading...