Replace the local implementation of 2d geometry by lowdim

This also forces an update of the rand dependency,
so while we are at it we update all the dependencies.
这个提交包含在:
Juergen Stuber
2023-04-10 00:57:36 +02:00
父节点 baf4df6c56
当前提交 7fe895f041
共有 10 个文件被更改,包括 588 次插入475 次删除

516
Cargo.lock 自动生成的
查看文件

@@ -1,207 +1,499 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]] [[package]]
name = "bitflags" name = "android_system_properties"
version = "1.0.4" version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
"libc",
]
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "bumpalo"
version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
[[package]]
name = "cc"
version = "1.0.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.6" version = "0.4.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
dependencies = [ dependencies = [
"num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "iana-time-zone",
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys",
"time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer",
"num-traits",
"time",
"wasm-bindgen",
"winapi",
] ]
[[package]] [[package]]
name = "cloudabi" name = "codespan-reporting"
version = "0.0.3" version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor",
"unicode-width",
] ]
[[package]] [[package]]
name = "fuchsia-zircon" name = "core-foundation-sys"
version = "0.3.3" version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
[[package]]
name = "cxx"
version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93"
dependencies = [ dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "cc",
"fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "cxxbridge-flags",
"cxxbridge-macro",
"link-cplusplus",
] ]
[[package]] [[package]]
name = "fuchsia-zircon-sys" name = "cxx-build"
version = "0.3.3" version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b"
dependencies = [
"cc",
"codespan-reporting",
"once_cell",
"proc-macro2",
"quote",
"scratch",
"syn 2.0.13",
]
[[package]]
name = "cxxbridge-flags"
version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb"
[[package]]
name = "cxxbridge-macro"
version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.13",
]
[[package]]
name = "getrandom"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
dependencies = [
"cfg-if",
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
]
[[package]]
name = "iana-time-zone"
version = "0.1.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
"windows",
]
[[package]]
name = "iana-time-zone-haiku"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca"
dependencies = [
"cxx",
"cxx-build",
]
[[package]]
name = "js-sys"
version = "0.3.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
dependencies = [
"wasm-bindgen",
]
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.44" version = "0.2.141"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5"
[[package]]
name = "link-cplusplus"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5"
dependencies = [
"cc",
]
[[package]]
name = "log"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
]
[[package]]
name = "lowdim"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "014a69d87fffff8f5facec9e56f7dc470399448dc8ceed0dbc61032d6651039d"
dependencies = [
"rand",
]
[[package]] [[package]]
name = "num-integer" name = "num-integer"
version = "0.1.39" version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
dependencies = [ dependencies = [
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "autocfg",
"num-traits",
] ]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.6" version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
version = "1.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
[[package]] [[package]]
name = "pixelfoo" name = "pixelfoo"
version = "0.1.0" version = "0.2.0"
dependencies = [ dependencies = [
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "chrono",
"rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "lowdim",
"rand",
]
[[package]]
name = "ppv-lite86"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro2"
version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
dependencies = [
"proc-macro2",
] ]
[[package]] [[package]]
name = "rand" name = "rand"
version = "0.6.1" version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [ dependencies = [
"cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc",
"fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha",
"libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core",
"rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "rand_chacha" name = "rand_chacha"
version = "0.1.0" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [ dependencies = [
"rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "ppv-lite86",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core",
] ]
[[package]] [[package]]
name = "rand_core" name = "rand_core"
version = "0.3.0" version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "rand_hc"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [ dependencies = [
"rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "getrandom",
] ]
[[package]] [[package]]
name = "rand_isaac" name = "scratch"
version = "0.1.1" version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1"
[[package]]
name = "syn"
version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [ dependencies = [
"rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2",
"quote",
"unicode-ident",
] ]
[[package]] [[package]]
name = "rand_pcg" name = "syn"
version = "0.1.1" version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec"
dependencies = [ dependencies = [
"rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "quote",
"unicode-ident",
] ]
[[package]] [[package]]
name = "rand_xorshift" name = "termcolor"
version = "0.1.0" version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
dependencies = [ dependencies = [
"rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util",
] ]
[[package]]
name = "redox_syscall"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "rustc_version"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "semver"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "semver-parser"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "time" name = "time"
version = "0.1.40" version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
dependencies = [ dependencies = [
"libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", "libc",
"redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", "wasi 0.10.0+wasi-snapshot-preview1",
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "winapi",
] ]
[[package]] [[package]]
name = "winapi" name = "unicode-ident"
version = "0.3.6" version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
[[package]]
name = "unicode-width"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
[[package]]
name = "wasi"
version = "0.10.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
dependencies = [ dependencies = [
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if",
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
"syn 1.0.109",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
] ]
[[package]] [[package]]
name = "winapi-i686-pc-windows-gnu" name = "winapi-i686-pc-windows-gnu"
version = "0.4.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "winapi-x86_64-pc-windows-gnu" name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[metadata] [[package]]
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" name = "windows"
"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" version = "0.48.0"
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" dependencies = [
"checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311" "windows-targets",
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" ]
"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
"checksum rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9d223d52ae411a33cf7e54ec6034ec165df296ccd23533d671a28252b6f66a" [[package]]
"checksum rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "771b009e3a508cb67e8823dda454aaa5368c7bc1c16829fb77d3e980440dd34a" name = "windows-targets"
"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" version = "0.48.0"
"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" dependencies = [
"checksum rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effa3fcaa47e18db002bdde6060944b6d2f9cfd8db471c30e873448ad9187be3" "windows_aarch64_gnullvm",
"checksum redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "679da7508e9a6390aeaf7fbd02a800fdc64b73fe2204dd2c8ae66d22d9d5ad5d" "windows_aarch64_msvc",
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "windows_i686_gnu",
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "windows_i686_msvc",
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "windows_x86_64_gnu",
"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" "windows_x86_64_gnullvm",
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "windows_x86_64_msvc",
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" ]
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
[[package]]
name = "windows_i686_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
[[package]]
name = "windows_i686_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"

查看文件

@@ -1,9 +1,10 @@
[package] [package]
name = "pixelfoo" name = "pixelfoo"
version = "0.1.0" version = "0.2.0"
authors = ["juergen <juergen@chaospott.de>"] authors = ["juergen <juergen@chaospott.de>"]
edition = "2018" edition = "2018"
[dependencies] [dependencies]
rand = "0.6.0" rand = "0.8.4"
chrono = "0.4.6" chrono = "0.4.6"
lowdim = { version = "0.6.0", features = ["random"] }

查看文件

@@ -56,8 +56,8 @@ fn main() -> std::io::Result<()> {
.take(y_size) .take(y_size)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
loop { loop {
let x = rng.gen_range(0, x_size); let x = rng.gen_range(0..x_size);
let y = rng.gen_range(0, y_size); let y = rng.gen_range(0..y_size);
let c = pick_color(c0, c1, &mut rng); let c = pick_color(c0, c1, &mut rng);
frame[y][x] = c; frame[y][x] = c;

查看文件

@@ -12,11 +12,16 @@ use chrono::Timelike;
use rand::thread_rng; use rand::thread_rng;
use rand::Rng; use rand::Rng;
use lowdim::bb2d;
use lowdim::p2d;
use lowdim::v2d;
use lowdim::Array2d;
use lowdim::BBox2d;
use lowdim::Point2d;
use lowdim::Vec2d;
use lowdim::Vector;
use pixelfoo::color::Color; use pixelfoo::color::Color;
use pixelfoo::point2d::p2d;
use pixelfoo::point2d::Point2d;
use pixelfoo::vec2d::v2d;
use pixelfoo::vec2d::Vec2d;
#[derive(Clone, Copy, Debug, PartialEq, Eq)] #[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum Square { enum Square {
@@ -37,17 +42,24 @@ impl Square {
} }
} }
struct Board(Vec<Vec<Square>>); #[derive(Clone, Debug)]
struct Board(Array2d<i64, Square>);
impl Board {
fn bbox(&self) -> BBox2d {
self.0.bbox()
}
}
fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> { fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> {
for line in &board.0 { for y in board.bbox().y_range() {
for square in line { for x in board.bbox().x_range() {
let square = board.0[p2d(x, y)];
let c = match square { let c = match square {
Square::Unused => Color::black(), Square::Unused => Color::black(),
Square::Unknown { prio } => { Square::Unknown { prio } => {
if *prio == 0 { if prio == 0 {
Color::black() Color::black()
} else if *prio > 0 { } else if prio > 0 {
Color::lightblue() Color::lightblue()
} else { } else {
Color::darkyellow() Color::darkyellow()
@@ -71,14 +83,15 @@ enum Orientation {
} }
impl Board { impl Board {
fn new(board_size: Vec2d, maze_size: Vec2d) -> Board { fn new(board_bbox: BBox2d, maze_bbox: BBox2d) -> Board {
Board( Board(Array2d::with(board_bbox, |p| {
(0..board_size.y) if maze_bbox.contains(&p) {
.map(move |y| { let x = p.x();
(0..board_size.x) let y = p.y();
.map(|x| { if x == maze_bbox.x_min()
if x < maze_size.x && y < maze_size.y { || x == maze_bbox.x_max()
if x == 0 || x == maze_size.x - 1 || y == 0 || y == maze_size.y - 1 || y == maze_bbox.y_min()
|| y == maze_bbox.y_max()
{ {
Square::Wall Square::Wall
} else if x % 2 != 0 && y % 2 != 0 { } else if x % 2 != 0 && y % 2 != 0 {
@@ -89,17 +102,13 @@ impl Board {
} else { } else {
Square::Unused Square::Unused
} }
}) }))
.collect::<Vec<_>>()
})
.collect::<Vec<_>>(),
)
} }
fn get(&self, pos: Point2d) -> Square { fn get(&self, pos: Point2d) -> Square {
self.0[pos.y as usize][pos.x as usize] self.0[pos]
} }
fn set(&mut self, pos: Point2d, sq: Square) { fn set(&mut self, pos: Point2d, sq: Square) {
self.0[pos.y as usize][pos.x as usize] = sq; self.0[pos] = sq;
} }
fn set_orientation(&mut self, desired: Orientation, pos: Point2d) { fn set_orientation(&mut self, desired: Orientation, pos: Point2d) {
@@ -107,14 +116,14 @@ impl Board {
match sq { match sq {
Square::Unknown { .. } => { Square::Unknown { .. } => {
let prio; let prio;
if pos.x % 2 == 0 && pos.y % 2 != 0 { if pos.x() % 2 == 0 && pos.y() % 2 != 0 {
// horizontal corridor, vertical wall // horizontal corridor, vertical wall
prio = if desired == Orientation::Vertical { prio = if desired == Orientation::Vertical {
10 10
} else { } else {
-10 -10
}; };
} else if pos.x % 2 != 0 && pos.y % 2 == 0 { } else if pos.x() % 2 != 0 && pos.y() % 2 == 0 {
// vertical corridor, horizontal wall // vertical corridor, horizontal wall
prio = if desired == Orientation::Horizontal { prio = if desired == Orientation::Horizontal {
10 10
@@ -137,28 +146,28 @@ impl Board {
self.set_orientation(Orientation::Vertical, pos); self.set_orientation(Orientation::Vertical, pos);
} }
fn draw_horizontal_segment(&mut self, pos: Point2d, size: Vec2d) { fn draw_horizontal_segment(&mut self, pos: Point2d, size: Vec2d) {
for x in 0..size.x { for x in 0..size.x() {
let xn = size.x - 1 - x; let xn = size.x() - 1 - x;
self.set_horizontal(pos + v2d(x, 0)); self.set_horizontal(pos + v2d(x, 0));
for y in 1..x.min(xn).min(size.y / 2) + 1 { for y in 1..x.min(xn).min(size.y() / 2) + 1 {
self.set_horizontal(pos + v2d(x, y)); self.set_horizontal(pos + v2d(x, y));
self.set_horizontal(pos + v2d(x, -y)); self.set_horizontal(pos + v2d(x, -y));
} }
} }
} }
fn draw_vertical_segment(&mut self, pos: Point2d, size: Vec2d) { fn draw_vertical_segment(&mut self, pos: Point2d, size: Vec2d) {
for y in 0..size.y { for y in 0..size.y() {
let yn = size.y - 1 - y; let yn = size.y() - 1 - y;
self.set_vertical(pos + v2d(0, y)); self.set_vertical(pos + v2d(0, y));
for x in 1..y.min(yn).min(size.x / 2) + 1 { for x in 1..y.min(yn).min(size.x() / 2) + 1 {
self.set_vertical(pos + v2d(x, y)); self.set_vertical(pos + v2d(x, y));
self.set_vertical(pos + v2d(-x, y)); self.set_vertical(pos + v2d(-x, y));
} }
} }
} }
fn draw_7_segments(&mut self, pos: Point2d, size: Vec2d, segments: u8) { fn draw_7_segments(&mut self, pos: Point2d, size: Vec2d, segments: u8) {
let length = size.x; let length = size.x();
let width = size.y; let width = size.y();
let delta = length + 1; let delta = length + 1;
let hsize = v2d(length, width); let hsize = v2d(length, width);
let vsize = v2d(width, length); let vsize = v2d(width, length);
@@ -226,7 +235,7 @@ where
open.push(Move { open.push(Move {
from, from,
dir, dir,
prio: prio * 100 + rng.gen_range(0, 1000), prio: prio * 100 + rng.gen_range(0..1000),
}); });
} }
} }
@@ -237,8 +246,8 @@ fn main() -> std::io::Result<()> {
let args = args().collect::<Vec<_>>(); let args = args().collect::<Vec<_>>();
eprintln!("executing {}", args[0]); eprintln!("executing {}", args[0]);
let x_size = args[1].parse::<usize>().unwrap(); let x_size = args[1].parse::<i64>().unwrap();
let y_size = args[2].parse::<usize>().unwrap(); let y_size = args[2].parse::<i64>().unwrap();
let arg = args[3].parse::<isize>().unwrap_or(DEFAULT_ARG); let arg = args[3].parse::<isize>().unwrap_or(DEFAULT_ARG);
eprintln!("screen size {}x{}, arg {}", x_size, y_size, arg); eprintln!("screen size {}x{}, arg {}", x_size, y_size, arg);
@@ -247,14 +256,11 @@ fn main() -> std::io::Result<()> {
let t_frame = 0.040; // s let t_frame = 0.040; // s
let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32); let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32);
let board_size = v2d(x_size as i32, y_size as i32); let board_bbox = bb2d(0..x_size, 0..y_size);
// round down to odd size for maze // round down to odd size for maze
let maze_size = v2d( let maze_bbox = bb2d(0..(x_size - 1) / 2 * 2 + 1, 0..(y_size - 1) / 2 * 2 + 1);
(board_size.x - 1) / 2 * 2 + 1,
(board_size.y - 1) / 2 * 2 + 1,
);
let mut board = Board(Vec::new()); let mut board = Board::new(board_bbox, maze_bbox);
let mut open = BinaryHeap::new(); let mut open = BinaryHeap::new();
let mut last_drawn_minute = 99; let mut last_drawn_minute = 99;
loop { loop {
@@ -267,7 +273,7 @@ fn main() -> std::io::Result<()> {
if m != last_drawn_minute { if m != last_drawn_minute {
last_drawn_minute = m; last_drawn_minute = m;
board = Board::new(board_size, maze_size); board = Board::new(board_bbox, maze_bbox);
// draw time in prios // draw time in prios
let segment_size = v2d(11, 5); let segment_size = v2d(11, 5);
@@ -277,23 +283,35 @@ fn main() -> std::io::Result<()> {
board.draw_digit(p2d(59, 7), segment_size, (m % 10) as u8); board.draw_digit(p2d(59, 7), segment_size, (m % 10) as u8);
// start building walls from the border // start building walls from the border
for x in (2..(maze_size.x - 2)).step_by(2) { for x in (2..(maze_bbox.x_max() - 1)).step_by(2) {
add_move(&board, &mut open, &mut rng, p2d(x, 0), v2d(0, 1));
add_move( add_move(
&board, &board,
&mut open, &mut open,
&mut rng, &mut rng,
p2d(x, maze_size.y - 1), p2d(x, maze_bbox.y_min()),
v2d(0, 1),
);
add_move(
&board,
&mut open,
&mut rng,
p2d(x, maze_bbox.y_max()),
v2d(0, -1), v2d(0, -1),
); );
} }
for y in (2..(maze_size.y - 2)).step_by(2) { for y in (2..(maze_bbox.y_max() - 1)).step_by(2) {
add_move(&board, &mut open, &mut rng, p2d(0, y), v2d(1, 0));
add_move( add_move(
&board, &board,
&mut open, &mut open,
&mut rng, &mut rng,
p2d(maze_size.x - 1, y), p2d(maze_bbox.x_min(), y),
v2d(1, 0),
);
add_move(
&board,
&mut open,
&mut rng,
p2d(maze_bbox.x_max(), y),
v2d(-1, 0), v2d(-1, 0),
); );
} }
@@ -316,7 +334,7 @@ fn main() -> std::io::Result<()> {
board.set(p1, Square::Wall); board.set(p1, Square::Wall);
board.set(p2, Square::Wall); board.set(p2, Square::Wall);
for dir1 in Vec2d::directions() { for dir1 in Vec2d::unit_vecs_l1() {
let p3 = p2 + dir1; let p3 = p2 + dir1;
let p4 = p3 + dir1; let p4 = p3 + dir1;
if board.get(p3).is_unknown() { if board.get(p3).is_unknown() {
@@ -332,12 +350,12 @@ fn main() -> std::io::Result<()> {
} }
if open.is_empty() { if open.is_empty() {
board.set(p2d(1, 1), Square::Start); board.set(maze_bbox.min() + v2d(1, 1), Square::Start);
board.set(p2d(maze_size.x - 2, maze_size.y - 2), Square::Finish); board.set(maze_bbox.max() - v2d(1, 1), Square::Finish);
} }
} }
let mut buf = Vec::with_capacity((board_size.x * board_size.y * 3) as usize); let mut buf = Vec::with_capacity(board_bbox.area() * 3);
send(&mut buf, &board)?; send(&mut buf, &board)?;
stdout().write_all(&buf)?; stdout().write_all(&buf)?;
stdout().flush()?; stdout().flush()?;

查看文件

@@ -12,11 +12,16 @@ use chrono::Timelike;
use rand::thread_rng; use rand::thread_rng;
use rand::Rng; use rand::Rng;
use lowdim::bb2d;
use lowdim::p2d;
use lowdim::v2d;
use lowdim::Array2d;
use lowdim::BBox2d;
use lowdim::Point2d;
use lowdim::Vec2d;
use lowdim::Vector;
use pixelfoo::color::Color; use pixelfoo::color::Color;
use pixelfoo::point2d::p2d;
use pixelfoo::point2d::Point2d;
use pixelfoo::vec2d::v2d;
use pixelfoo::vec2d::Vec2d;
#[derive(Clone, Copy, Debug, PartialEq, Eq)] #[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum Square { enum Square {
@@ -37,17 +42,24 @@ impl Square {
} }
} }
struct Board(Vec<Vec<Square>>); #[derive(Clone, Debug)]
struct Board(Array2d<i64, Square>);
impl Board {
fn bbox(&self) -> BBox2d {
self.0.bbox()
}
}
fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> { fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> {
for line in &board.0 { for y in board.bbox().y_range() {
for square in line { for x in board.bbox().x_range() {
let square = board.0[p2d(x, y)];
let c = match square { let c = match square {
Square::Unused => Color::black(), Square::Unused => Color::black(),
Square::Unknown { prio } => { Square::Unknown { prio } => {
if *prio == 0 { if prio == 0 {
Color::black() Color::black()
} else if *prio < 0 { } else if prio < 0 {
Color::lightblue() Color::lightblue()
} else { } else {
Color::darkyellow() Color::darkyellow()
@@ -71,17 +83,15 @@ enum Orientation {
} }
impl Board { impl Board {
fn new(board_size: Vec2d, maze_size: Vec2d) -> Board { fn new(board_bbox: BBox2d, maze_bbox: BBox2d) -> Board {
Board( Board(Array2d::with(board_bbox, |p| {
(0..board_size.y) if maze_bbox.contains(&p) {
.map(move |y| { let x = p.x();
(0..board_size.x) let y = p.y();
.map(|x| { if x == maze_bbox.x_min()
if x < maze_size.x && y < maze_size.y { || x == maze_bbox.x_max()
if x == 0 || y == maze_bbox.y_min()
|| x == maze_size.x - 1 || y == maze_bbox.y_max()
|| y == 0
|| y == maze_size.y - 1
|| (x % 2 == 0 && y % 2 == 0) || (x % 2 == 0 && y % 2 == 0)
{ {
Square::Wall Square::Wall
@@ -91,17 +101,13 @@ impl Board {
} else { } else {
Square::Unused Square::Unused
} }
}) }))
.collect::<Vec<_>>()
})
.collect::<Vec<_>>(),
)
} }
fn get(&self, pos: Point2d) -> Square { fn get(&self, pos: Point2d) -> Square {
self.0[pos.y as usize][pos.x as usize] self.0[pos]
} }
fn set(&mut self, pos: Point2d, sq: Square) { fn set(&mut self, pos: Point2d, sq: Square) {
self.0[pos.y as usize][pos.x as usize] = sq; self.0[pos] = sq;
} }
fn set_orientation(&mut self, desired: Orientation, pos: Point2d) { fn set_orientation(&mut self, desired: Orientation, pos: Point2d) {
@@ -109,14 +115,14 @@ impl Board {
match sq { match sq {
Square::Unknown { .. } => { Square::Unknown { .. } => {
let prio; let prio;
if pos.x % 2 == 0 && pos.y % 2 != 0 { if pos.x() % 2 == 0 && pos.y() % 2 != 0 {
// horizontal corridor, vertical wall // horizontal corridor, vertical wall
prio = if desired == Orientation::Horizontal { prio = if desired == Orientation::Horizontal {
10 10
} else { } else {
-10 -10
}; };
} else if pos.x % 2 != 0 && pos.y % 2 == 0 { } else if pos.x() % 2 != 0 && pos.y() % 2 == 0 {
// vertical corridor, horizontal wall // vertical corridor, horizontal wall
prio = if desired == Orientation::Vertical { prio = if desired == Orientation::Vertical {
10 10
@@ -139,28 +145,28 @@ impl Board {
self.set_orientation(Orientation::Vertical, pos); self.set_orientation(Orientation::Vertical, pos);
} }
fn draw_horizontal_segment(&mut self, pos: Point2d, size: Vec2d) { fn draw_horizontal_segment(&mut self, pos: Point2d, size: Vec2d) {
for x in 0..size.x { for x in 0..size.x() {
let xn = size.x - 1 - x; let xn = size.x() - 1 - x;
self.set_horizontal(pos + v2d(x, 0)); self.set_horizontal(pos + v2d(x, 0));
for y in 1..x.min(xn).min(size.y / 2) + 1 { for y in 1..x.min(xn).min(size.y() / 2) + 1 {
self.set_horizontal(pos + v2d(x, y)); self.set_horizontal(pos + v2d(x, y));
self.set_horizontal(pos + v2d(x, -y)); self.set_horizontal(pos + v2d(x, -y));
} }
} }
} }
fn draw_vertical_segment(&mut self, pos: Point2d, size: Vec2d) { fn draw_vertical_segment(&mut self, pos: Point2d, size: Vec2d) {
for y in 0..size.y { for y in 0..size.y() {
let yn = size.y - 1 - y; let yn = size.y() - 1 - y;
self.set_vertical(pos + v2d(0, y)); self.set_vertical(pos + v2d(0, y));
for x in 1..y.min(yn).min(size.x / 2) + 1 { for x in 1..y.min(yn).min(size.x() / 2) + 1 {
self.set_vertical(pos + v2d(x, y)); self.set_vertical(pos + v2d(x, y));
self.set_vertical(pos + v2d(-x, y)); self.set_vertical(pos + v2d(-x, y));
} }
} }
} }
fn draw_7_segments(&mut self, pos: Point2d, size: Vec2d, segments: u8) { fn draw_7_segments(&mut self, pos: Point2d, size: Vec2d, segments: u8) {
let length = size.x; let length = size.x();
let width = size.y; let width = size.y();
let delta = length + 1; let delta = length + 1;
let hsize = v2d(length, width); let hsize = v2d(length, width);
let vsize = v2d(width, length); let vsize = v2d(width, length);
@@ -228,7 +234,7 @@ where
open.push(Move { open.push(Move {
from, from,
dir, dir,
prio: prio * 100 + rng.gen_range(0, 1000), prio: prio * 100 + rng.gen_range(0..1000),
}); });
} }
} }
@@ -239,8 +245,8 @@ fn main() -> std::io::Result<()> {
let args = args().collect::<Vec<_>>(); let args = args().collect::<Vec<_>>();
eprintln!("executing {}", args[0]); eprintln!("executing {}", args[0]);
let x_size = args[1].parse::<usize>().unwrap(); let x_size = args[1].parse::<i64>().unwrap();
let y_size = args[2].parse::<usize>().unwrap(); let y_size = args[2].parse::<i64>().unwrap();
let arg = args[3].parse::<isize>().unwrap_or(DEFAULT_ARG); let arg = args[3].parse::<isize>().unwrap_or(DEFAULT_ARG);
eprintln!("screen size {}x{}, arg {}", x_size, y_size, arg); eprintln!("screen size {}x{}, arg {}", x_size, y_size, arg);
@@ -249,16 +255,13 @@ fn main() -> std::io::Result<()> {
let t_frame = 0.040; // s let t_frame = 0.040; // s
let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32); let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32);
let board_size = v2d(x_size as i32, y_size as i32); let board_bbox = bb2d(0..x_size, 0..y_size);
// round down to odd size for maze // round down to odd size for maze
let maze_size = v2d( let maze_bbox = bb2d(0..(x_size - 1) / 2 * 2 + 1, 0..(y_size - 1) / 2 * 2 + 1);
(board_size.x - 1) / 2 * 2 + 1,
(board_size.y - 1) / 2 * 2 + 1,
);
// pick odd position at or near the middle // pick odd position at or near the middle
let maze_mid = p2d((maze_size.x - 1) / 4 * 2 + 1, (maze_size.y - 1) / 4 * 2 + 1); let maze_mid = maze_bbox.center();
let mut board = Board(Vec::new()); let mut board = Board::new(board_bbox, maze_bbox);
let mut open = BinaryHeap::new(); let mut open = BinaryHeap::new();
let mut last_drawn_minute = 99; let mut last_drawn_minute = 99;
loop { loop {
@@ -271,7 +274,7 @@ fn main() -> std::io::Result<()> {
if m != last_drawn_minute { if m != last_drawn_minute {
last_drawn_minute = m; last_drawn_minute = m;
board = Board::new(board_size, maze_size); board = Board::new(board_bbox, maze_bbox);
// draw time in prios // draw time in prios
let segment_size = v2d(11, 5); let segment_size = v2d(11, 5);
@@ -305,7 +308,7 @@ fn main() -> std::io::Result<()> {
board.set(p1, Square::Corridor); board.set(p1, Square::Corridor);
board.set(p2, Square::Corridor); board.set(p2, Square::Corridor);
for dir1 in Vec2d::directions() { for dir1 in Vec2d::unit_vecs_l1() {
let p3 = p2 + dir1; let p3 = p2 + dir1;
let p4 = p3 + dir1; let p4 = p3 + dir1;
if board.get(p3).is_unknown() { if board.get(p3).is_unknown() {
@@ -321,12 +324,12 @@ fn main() -> std::io::Result<()> {
} }
if open.is_empty() { if open.is_empty() {
board.set(p2d(1, 1), Square::Start); board.set(maze_bbox.min() + v2d(1, 1), Square::Start);
board.set(p2d(maze_size.x - 2, maze_size.y - 2), Square::Finish); board.set(maze_bbox.max() - v2d(1, 1), Square::Finish);
} }
} }
let mut buf = Vec::with_capacity((board_size.x * board_size.y * 3) as usize); let mut buf = Vec::with_capacity(board_bbox.area() * 3);
send(&mut buf, &board)?; send(&mut buf, &board)?;
stdout().write_all(&buf)?; stdout().write_all(&buf)?;
stdout().flush()?; stdout().flush()?;

查看文件

@@ -1,18 +1,19 @@
use std::env::args; use std::env::args;
use std::io::stdout; use std::io::stdout;
use std::io::Write; use std::io::Write;
use std::iter::repeat_with;
use std::thread::sleep; use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
use rand::thread_rng; use rand::thread_rng;
use rand::Rng; use rand::Rng;
use lowdim::bb2d;
use lowdim::p2d;
use lowdim::Array2d;
use lowdim::BBox2d;
use lowdim::Point2d;
use pixelfoo::color::Color; use pixelfoo::color::Color;
use pixelfoo::point2d::Point2d;
use pixelfoo::rect2d::Rect2d;
use pixelfoo::vec2d::v2d;
use pixelfoo::vec2d::Vec2d;
#[derive(Clone, Copy, Debug, PartialEq, Eq)] #[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum Square { enum Square {
@@ -22,40 +23,27 @@ enum Square {
Fox, Fox,
} }
struct Board(Vec<Vec<Square>>); #[derive(Clone, Debug)]
struct Board(Array2d<i64, Square>);
impl Board { impl Board {
pub fn new(size: Vec2d, mut f: impl FnMut() -> Square) -> Board { pub fn new(bbox: BBox2d, mut f: impl FnMut() -> Square) -> Board {
Board( Board(Array2d::with(bbox, |_p| f()))
repeat_with(|| {
repeat_with(&mut f)
.take(size.x as usize)
.collect::<Vec<_>>()
})
.take(size.y as usize)
.collect::<Vec<_>>(),
)
} }
pub fn size(&self) -> Vec2d { fn bbox(&self) -> BBox2d {
let x_size = self.0[0].len() as i32; self.0.bbox()
let y_size = self.0.len() as i32;
v2d(x_size, y_size)
} }
pub fn rect(&self) -> Rect2d { fn get(&self, pos: Point2d) -> Square {
Rect2d::new(0, self.size().x, 0, self.size().y) self.0[pos]
} }
pub fn get(&self, pos: Point2d) -> Square { fn set(&mut self, pos: Point2d, sq: Square) {
self.0[pos.y as usize][pos.x as usize] self.0[pos] = sq;
}
pub fn set(&mut self, pos: Point2d, sq: Square) {
self.0[pos.y as usize][pos.x as usize] = sq;
} }
} }
fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> { fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> {
let Board(lines) = board; for y in board.bbox().y_range() {
for line in lines { for x in board.bbox().x_range() {
for square in line { let square = board.0[p2d(x, y)];
let c = match square { let c = match square {
Square::Empty => Color::blue(), Square::Empty => Color::blue(),
Square::Grass => Color::green(), Square::Grass => Color::green(),
@@ -68,11 +56,9 @@ fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> {
w.flush() w.flush()
} }
const DEFAULT_ARG: usize = 10;
fn grow(board: &Board, pos: Point2d, grow: Square, die: Square) -> Square { fn grow(board: &Board, pos: Point2d, grow: Square, die: Square) -> Square {
for pos1 in pos.neighbours() { for pos1 in pos.neighbors_l1() {
if board.rect().contains(pos1) { if board.bbox().contains(&pos1) {
let neigh_sq = board.get(pos1); let neigh_sq = board.get(pos1);
if neigh_sq == grow { if neigh_sq == grow {
return grow; return grow;
@@ -82,23 +68,24 @@ fn grow(board: &Board, pos: Point2d, grow: Square, die: Square) -> Square {
die die
} }
const DEFAULT_ARG: usize = 10;
fn main() -> std::io::Result<()> { fn main() -> std::io::Result<()> {
let args = args().collect::<Vec<_>>(); let args = args().collect::<Vec<_>>();
eprintln!("executing {}", args[0]); eprintln!("executing {}", args[0]);
let x_size = args[1].parse::<usize>().unwrap(); let x_size = args[1].parse::<i64>().unwrap();
let y_size = args[2].parse::<usize>().unwrap(); let y_size = args[2].parse::<i64>().unwrap();
let arg = args[3].parse::<usize>().unwrap_or(DEFAULT_ARG); let arg = args[3].parse::<usize>().unwrap_or(DEFAULT_ARG);
eprintln!("screen size {}x{}, arg {}", x_size, y_size, arg); eprintln!("screen size {}x{}, arg {}", x_size, y_size, arg);
let mut rng = thread_rng(); let mut rng = thread_rng();
let size = v2d(x_size as i32, y_size as i32); let bbox = bb2d(0..x_size, 0..y_size);
let p_empty = 0.25; let p_empty = 0.25;
let p_grass = 0.25; let p_grass = 0.25;
let p_rabbit = 0.25; let p_rabbit = 0.25;
// p_fox = 0.05 let mut board = Board::new(bbox, || {
let mut board = Board::new(size, || {
let p = rng.gen::<f64>(); let p = rng.gen::<f64>();
if p < p_empty { if p < p_empty {
Square::Empty Square::Empty
@@ -115,18 +102,18 @@ fn main() -> std::io::Result<()> {
let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32); let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32);
// mid point of the board // mid point of the board
let x_mid = (x_size - 1) as f64 / 2.0; let x_mid = (bbox.x_min() + bbox.x_max()) as f64 / 2.0;
let y_mid = (y_size - 1) as f64 / 2.0; let y_mid = (bbox.y_min() + bbox.y_max()) as f64 / 2.0;
// radius of the death zone in the middle // radius of the death zone in the middle
let r = (x_size.min(y_size) - 1) as f64 / 2.5; let r = (x_size.min(y_size) - 1) as f64 / 2.5;
loop { loop {
for _ in 0..arg { for _ in 0..arg {
let pos = board.rect().random_point(&mut rng); let pos = bbox.random_point(&mut rng);
let sq = board.get(pos); let sq = board.get(pos);
let dx = (pos.x as f64 - x_mid as f64) / r as f64; let dx = (pos.x() as f64 - x_mid as f64) / r as f64;
let dy = (pos.y as f64 - y_mid as f64) / r as f64; let dy = (pos.y() as f64 - y_mid as f64) / r as f64;
let p0 = (dx * dx + dy * dy).min(1.0); let p0 = (dx * dx + dy * dy).min(1.0);
let p_survive = match sq { let p_survive = match sq {
Square::Empty => 1.0, Square::Empty => 1.0,
@@ -150,7 +137,7 @@ fn main() -> std::io::Result<()> {
); );
} }
let mut buf = Vec::with_capacity(x_size * y_size * 3); let mut buf = Vec::with_capacity(bbox.area() * 3);
send(&mut buf, &board)?; send(&mut buf, &board)?;
stdout().write_all(&buf)?; stdout().write_all(&buf)?;
stdout().flush()?; stdout().flush()?;

查看文件

@@ -1,7 +1 @@
pub mod color; pub mod color;
pub mod vec2d;
pub mod point2d;
pub mod rect2d;

查看文件

@@ -1,63 +0,0 @@
use std::ops::Add;
use crate::vec2d::Vec2d;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Point2d {
pub x: i32,
pub y: i32,
}
impl Point2d {
pub fn new(x: i32, y: i32) -> Point2d {
Point2d { x, y }
}
pub fn neighbours(&self) -> Vec<Point2d> {
Vec2d::directions().iter().map(|v| self + v).collect()
}
}
pub fn p2d(x: i32, y: i32) -> Point2d {
Point2d::new(x, y)
}
impl Add<Vec2d> for Point2d {
type Output = Point2d;
fn add(self, other: Vec2d) -> Point2d {
let x = self.x + other.x;
let y = self.y + other.y;
Point2d { x, y }
}
}
impl<'a> Add<&'a Vec2d> for Point2d {
type Output = Point2d;
fn add(self, other: &'a Vec2d) -> Point2d {
let x = self.x + other.x;
let y = self.y + other.y;
Point2d { x, y }
}
}
impl<'a> Add<Vec2d> for &'a Point2d {
type Output = Point2d;
fn add(self, other: Vec2d) -> Point2d {
let x = self.x + other.x;
let y = self.y + other.y;
Point2d { x, y }
}
}
impl<'a> Add<&'a Vec2d> for &'a Point2d {
type Output = Point2d;
fn add(self, other: &'a Vec2d) -> Point2d {
let x = self.x + other.x;
let y = self.y + other.y;
Point2d { x, y }
}
}

查看文件

@@ -1,58 +0,0 @@
use rand::Rng;
use crate::point2d::p2d;
use crate::point2d::Point2d;
use crate::vec2d::v2d;
use crate::vec2d::Vec2d;
pub struct Rect2d {
origin: Point2d,
size: Vec2d,
}
impl Rect2d {
pub fn new(x0: i32, x1: i32, y0: i32, y1: i32) -> Rect2d {
assert!(x0 <= x1 && y0 <= y1);
let origin = p2d(x0, y0);
let size = v2d(x1 - x0, y1 - y0);
Rect2d { origin, size }
}
pub fn left(&self) -> i32 {
self.origin.x
}
pub fn right(&self) -> i32 {
self.origin.x + self.size.x
}
pub fn bottom(&self) -> i32 {
self.origin.y
}
pub fn top(&self) -> i32 {
self.origin.y + self.size.y
}
pub fn width(&self) -> i32 {
self.size.x
}
pub fn height(&self) -> i32 {
self.size.y
}
pub fn contains(&self, p: Point2d) -> bool {
self.left() <= p.x && p.x < self.right() && self.bottom() <= p.y && p.y < self.top()
}
pub fn random_point<R>(&self, rng: &mut R) -> Point2d
where
R: Rng,
{
let x = rng.gen_range(self.left(), self.right());
let y = rng.gen_range(self.bottom(), self.top());
p2d(x, y)
}
}
pub fn r2d(x0: i32, x1: i32, y0: i32, y1: i32) -> Rect2d {
Rect2d::new(x0, x1, y0, y1)
}

查看文件

@@ -1,61 +0,0 @@
use std::ops::Add;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Vec2d {
pub x: i32,
pub y: i32,
}
impl Vec2d {
pub fn new(x: i32, y: i32) -> Vec2d {
Vec2d { x, y }
}
pub fn directions() -> Vec<Vec2d> {
vec![v2d(1, 0), v2d(0, 1), v2d(-1, 0), v2d(0, -1)]
}
}
pub fn v2d(x: i32, y: i32) -> Vec2d {
Vec2d::new(x, y)
}
impl Add for Vec2d {
type Output = Vec2d;
fn add(self, other: Vec2d) -> Vec2d {
let x = self.x + other.x;
let y = self.y + other.y;
Vec2d { x, y }
}
}
impl<'a> Add<&'a Vec2d> for Vec2d {
type Output = Vec2d;
fn add(self, other: &'a Vec2d) -> Vec2d {
let x = self.x + other.x;
let y = self.y + other.y;
Vec2d { x, y }
}
}
impl<'a> Add<Vec2d> for &'a Vec2d {
type Output = Vec2d;
fn add(self, other: Vec2d) -> Vec2d {
let x = self.x + other.x;
let y = self.y + other.y;
Vec2d { x, y }
}
}
impl<'a> Add<&'a Vec2d> for &'a Vec2d {
type Output = Vec2d;
fn add(self, other: &'a Vec2d) -> Vec2d {
let x = self.x + other.x;
let y = self.y + other.y;
Vec2d { x, y }
}
}