为了账号安全,请及时绑定邮箱和手机立即绑定

3D 等距投影的着色

3D 等距投影的着色

BIG阳 2022-11-23 19:59:48
问题是,基于以下程序 https://github.com/adonovan/gopl.io/blob/master/ch3/surface/main.go将其转为 Web 服务器并将 SVG 呈现为网页为 SVG 着色,使峰为红色,谷为蓝色我肯定第一部分是对的,我想我第二部分是对的,但显然不是,但我不知道我哪里错了。请帮忙。package mainimport (    "fmt"    "math"    "net/http"    "strconv")const (    cells   = 100         // number of grid cells    xyrange = 30.0        // axis ranges (-xyrange..+xyrange)    angle   = math.Pi / 6 // angle of x, y axes (=30°))var height, width = 300, 600 // canvas size in pixelsvar xyscale = width / 2 / xyrange  // pixels per x or y unitvar zscale = float64(height) * 0.4 // pixels per z unitvar sin30, cos30 = math.Sin(angle), math.Cos(angle) // sin(30°), cos(30°)func main() {    addr := ":8000"    fmt.Printf("Visit\n  http://localhost%s/\n  http://localhost%[1]s/?height=600&width=1200\n", addr)    //http server    http.HandleFunc("/", handle)    http.ListenAndServe(addr, nil)}func handle(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Content-Type", "image/svg+xml")    if err := r.ParseForm(); err != nil {        return    }    for k, v := range r.Form {        if k == "height" {            h, _ := strconv.Atoi(v[0])            if h > 0 {                height = h            }        }        if k == "width" {            w, _ := strconv.Atoi(v[0])            if w > 0 {                width = w            }        }    }    fmt.Fprintf(w, "</svg>")}这是我得到的结果:注意,虽然这个问题似乎是针对 Go 的,但它实际上是 getColor()我要问的算法。即使您不使用 Go 编写,您也可以理解/回答。
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您的代码使用格式动词%x将十六进制值打印到 SVG 的fill属性:

fmt.Fprintf(w, "<polygon points='%g,%g %g,%g %g,%g %g,%g' fill='#%x%x%x'/>\n",
                ax, ay, bx, by, cx, cy, dx, dy, r, g, b)

这会导致某些数字(如 0 和 1)被格式化为一个十六进制数字。例如 RGB (254, 0, 1) 将被格式化为fe01. 然后浏览器会错误地呈现颜色。

将格式动词更改为%02x以确保 RGB 始终以两个十六进制数字打印。

现在 RGB (254, 0, 1) 打印为fe0001,这是正确的十六进制颜色。

输出:

//img1.sycdn.imooc.com//637e0b830001b2b706590389.jpg

查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 65 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信