亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? scanconverter.java

?? Java games programing--很好的java游戲編程源碼
?? JAVA
字號:
package com.brackeen.javagamebook.graphics3D;

import com.brackeen.javagamebook.math3D.*;
import com.brackeen.javagamebook.util.MoreMath;

/**
    The ScanConverter class converts a projected polygon into a
    series of horizontal scans for drawing.
*/
public class ScanConverter {

    private static final int SCALE_BITS = 16;
    private static final int SCALE = 1 << SCALE_BITS;
    private static final int SCALE_MASK = SCALE - 1;

    protected ViewWindow view;
    protected Scan[] scans;
    protected int top;
    protected int bottom;

    /**
        A horizontal scan line.
    */
    public static class Scan {
        public int left;
        public int right;

        /**
            Sets the left and right boundary for this scan if
            the x value is outside the current boundary.
        */
        public void setBoundary(int x) {
            if (x < left) {
                left = x;
            }
            if (x-1 > right) {
                right = x-1;
            }
        }


        /**
            Clears this scan line.
        */
        public void clear() {
            left = Integer.MAX_VALUE;
            right = Integer.MIN_VALUE;
        }


        /**
            Determines if this scan is valid (if left <= right).
        */
        public boolean isValid() {
            return (left <= right);
        }


        /**
            Sets this scan.
        */
        public void setTo(int left, int right) {
            this.left = left;
            this.right = right;
        }


        /**
            Checks if this scan is equal to the specified values.
        */
        public boolean equals(int left, int right) {
            return (this.left == left && this.right == right);
        }
    }


    /**
        Creates a new ScanConverter for the specified ViewWindow.
        The ViewWindow's properties can change in between scan
        conversions.
    */
    public ScanConverter(ViewWindow view) {
        this.view = view;
    }


    /**
        Gets the top boundary of the last scan-converted polygon.
    */
    public int getTopBoundary() {
        return top;
    }


    /**
        Gets the bottom boundary of the last scan-converted
        polygon.
    */
    public int getBottomBoundary() {
        return bottom;
    }


    /**
        Gets the scan line for the specified y value.
    */
    public Scan getScan(int y) {
        return scans[y];
    }


    /**
        Ensures this ScanConverter has the capacity to
        scan-convert a polygon to the ViewWindow.
    */
    protected void ensureCapacity() {
        int height = view.getTopOffset() + view.getHeight();
        if (scans == null || scans.length != height) {
            scans = new Scan[height];
            for (int i=0; i<height; i++) {
                scans[i] = new Scan();
            }
            // set top and bottom so clearCurrentScan clears all
            top = 0;
            bottom = height - 1;
        }

    }


    /**
        Clears the current scan.
    */
    private void clearCurrentScan() {
        for (int i=top; i<=bottom; i++) {
            scans[i].clear();
        }
        top = Integer.MAX_VALUE;
        bottom = Integer.MIN_VALUE;
    }


    /**
        Scan-converts a projected polygon. Returns true if the
        polygon is visible in the view window.
    */
    public boolean convert(Polygon3D polygon) {

        ensureCapacity();
        clearCurrentScan();

        int minX = view.getLeftOffset();
        int maxX = view.getLeftOffset() + view.getWidth() - 1;
        int minY = view.getTopOffset();
        int maxY = view.getTopOffset() + view.getHeight() - 1;

        int numVertices = polygon.getNumVertices();
        for (int i=0; i<numVertices; i++) {
            Vector3D v1 = polygon.getVertex(i);
            Vector3D v2;
            if (i == numVertices - 1) {
                v2 = polygon.getVertex(0);
            }
            else {
                v2 = polygon.getVertex(i+1);
            }

            // ensure v1.y < v2.y
            if (v1.y > v2.y) {
                Vector3D temp = v1;
                v1 = v2;
                v2 = temp;
            }
            float dy = v2.y - v1.y;

            // ignore horizontal lines
            if (dy == 0) {
                continue;
            }

            int startY = Math.max(MoreMath.ceil(v1.y), minY);
            int endY = Math.min(MoreMath.ceil(v2.y)-1, maxY);
            top = Math.min(top, startY);
            bottom = Math.max(bottom, endY);
            float dx = v2.x - v1.x;

            // special case: vertical line
            if (dx == 0) {
                int x = MoreMath.ceil(v1.x);
                // ensure x within view bounds
                x = Math.min(maxX+1, Math.max(x, minX));
                for (int y=startY; y<=endY; y++) {
                    scans[y].setBoundary(x);
                }
            }
            else {
                // scan-convert this edge (line equation)
                float gradient = dx / dy;

                // (slower version)
                /*
                for (int y=startY; y<=endY; y++) {
                    int x = MoreMath.ceil(v1.x + (y - v1.y) * gradient);
                    // ensure x within view bounds
                    x = Math.min(maxX+1, Math.max(x, minX));
                    scans[y].setBoundary(x);
                }
                */

                // (faster version)

                // trim start of line
                float startX = v1.x + (startY - v1.y) * gradient;
                if (startX < minX) {
                    int yInt = (int)(v1.y + (minX - v1.x) /
                        gradient);
                    yInt = Math.min(yInt, endY);
                    while (startY <= yInt) {
                        scans[startY].setBoundary(minX);
                        startY++;
                    }
                }
                else if (startX > maxX) {
                    int yInt = (int)(v1.y + (maxX - v1.x) /
                        gradient);
                    yInt = Math.min(yInt, endY);
                    while (startY <= yInt) {
                        scans[startY].setBoundary(maxX+1);
                        startY++;
                    }
                }

                if (startY > endY) {
                    continue;
                }

                // trim back of line
                float endX = v1.x + (endY - v1.y) * gradient;
                if (endX < minX) {
                    int yInt = MoreMath.ceil(v1.y + (minX - v1.x) /
                        gradient);
                    yInt = Math.max(yInt, startY);
                    while (endY >= yInt) {
                        scans[endY].setBoundary(minX);
                        endY--;
                    }
                }
                else if (endX > maxX) {
                    int yInt = MoreMath.ceil(v1.y + (maxX - v1.x) /
                        gradient);
                    yInt = Math.max(yInt, startY);
                    while (endY >= yInt) {
                        scans[endY].setBoundary(maxX+1);
                        endY--;
                    }
                }

                if (startY > endY) {
                    continue;
                }

                // line equation using integers
                int xScaled = (int)(SCALE * v1.x +
                    SCALE * (startY - v1.y) * dx / dy) + SCALE_MASK;
                int dxScaled = (int)(dx * SCALE / dy);

                for (int y=startY; y<=endY; y++) {
                    scans[y].setBoundary(xScaled >> SCALE_BITS);
                    xScaled+=dxScaled;
                }
            }
        }

        // check if visible (any valid scans)
        for (int i=top; i<=bottom; i++) {
            if (scans[i].isValid()) {
                return true;
            }
        }
        return false;
    }



}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产丝袜欧美中文另类| 日韩午夜激情视频| 欧美日韩一区二区三区高清 | 91网站在线播放| 国产精品成人免费精品自在线观看| 亚洲男同1069视频| 麻豆传媒一区二区三区| 色婷婷久久久亚洲一区二区三区 | 国产一二精品视频| 91精品国产综合久久香蕉麻豆| 欧美巨大另类极品videosbest| 日韩精品一区二区三区视频播放| 中文字幕av一区 二区| 亚洲国产日韩一级| 99久久精品久久久久久清纯| 精品成人a区在线观看| 日韩 欧美一区二区三区| 99re热这里只有精品免费视频| 久久精品亚洲国产奇米99| 日本三级亚洲精品| 91精品国产综合久久久蜜臀图片| 欧美国产精品v| 久久电影网站中文字幕| 91精品国产欧美一区二区18| 亚洲成人动漫精品| 欧美亚洲一区二区在线| 一级女性全黄久久生活片免费| 成人福利视频网站| 国产欧美一区二区精品婷婷| 韩国成人精品a∨在线观看| 亚洲精品视频观看| 亚洲蜜臀av乱码久久精品| 国产69精品久久777的优势| 精品免费视频一区二区| 另类专区欧美蜜桃臀第一页| 日韩欧美美女一区二区三区| 亚洲成人在线观看视频| 欧美高清视频在线高清观看mv色露露十八| 亚洲视频在线观看三级| 成人禁用看黄a在线| 综合在线观看色| 99久久精品国产精品久久| 国产性天天综合网| 成人午夜电影小说| 国产精品每日更新| 9人人澡人人爽人人精品| 国产精品乱码久久久久久| kk眼镜猥琐国模调教系列一区二区| 久久久久久久久久美女| 国产精品一二三区| 中文字幕亚洲一区二区av在线| 99久久夜色精品国产网站| 综合欧美一区二区三区| 欧美视频在线播放| 青青青伊人色综合久久| 日韩美女视频一区二区在线观看| 国产一区二区三区香蕉| 国产视频一区在线观看| 中文字幕一区二区三区精华液| 久久男人中文字幕资源站| 国产成人精品1024| 国产无一区二区| 色综合网色综合| 午夜a成v人精品| 欧美一区二区三区在| 国产高清视频一区| 亚洲电影激情视频网站| 欧美一级淫片007| 粉嫩欧美一区二区三区高清影视| 亚洲人成网站影音先锋播放| 欧美色窝79yyyycom| 国产精品1区2区| 一区二区三区电影在线播| 日韩视频一区在线观看| 成人h版在线观看| 日本特黄久久久高潮| 日本一区二区三区国色天香 | 欧美激情在线看| 欧美视频在线不卡| 国产精品一区免费视频| 亚洲第一激情av| 亚洲视频在线一区| 国产亚洲欧美在线| 国产资源在线一区| 91在线你懂得| 五月婷婷色综合| 国产午夜亚洲精品羞羞网站| 7777精品伊人久久久大香线蕉完整版 | 久久久国产一区二区三区四区小说| 色呦呦国产精品| 国产高清不卡一区二区| 日本成人超碰在线观看| 一区二区三区四区在线播放| 国产人久久人人人人爽| 欧美一区二区三区在线看| 在线免费观看视频一区| av在线播放不卡| 国产精品夜夜嗨| 国模冰冰炮一区二区| 美腿丝袜在线亚洲一区| 午夜精品福利一区二区三区av| 色www精品视频在线观看| 精品国产免费人成电影在线观看四季 | 精品欧美黑人一区二区三区| 欧美视频一区二区三区| 97精品久久久久中文字幕| 懂色av一区二区在线播放| 国产乱码精品一区二区三区av| 麻豆精品国产传媒mv男同| 日韩高清中文字幕一区| 亚洲chinese男男1069| 亚洲成av人片一区二区三区| 亚洲综合av网| 亚洲v精品v日韩v欧美v专区| 亚洲成人在线免费| 亚洲国产成人va在线观看天堂| 亚洲黄色av一区| 亚洲国产精品嫩草影院| 日韩精品一卡二卡三卡四卡无卡| 亚洲3atv精品一区二区三区| 天天操天天色综合| 在线观看三级视频欧美| 亚洲色图欧美在线| 国产精品天美传媒| 中文字幕+乱码+中文字幕一区| 国产拍欧美日韩视频二区| 久久综合九色综合欧美就去吻| 久久久久久久精| 欧美激情一区在线| 最好看的中文字幕久久| 一级中文字幕一区二区| 天堂va蜜桃一区二区三区漫画版| 日本特黄久久久高潮| 国产在线视频一区二区三区| 国产精品自拍一区| 99这里只有久久精品视频| 欧美中文字幕一区二区三区 | 在线一区二区三区四区五区| 欧美无砖专区一中文字| 欧美美女一区二区在线观看| 欧美日韩国产首页在线观看| 日韩午夜电影在线观看| 国产人久久人人人人爽| 综合欧美一区二区三区| 亚洲国产综合91精品麻豆| 激情六月婷婷久久| 性久久久久久久| 免费亚洲电影在线| 国产成人在线网站| 日本丶国产丶欧美色综合| 91精品国产免费| 国产亚洲一本大道中文在线| 亚洲人成7777| 久久99最新地址| 91免费国产在线观看| 91精品国产91综合久久蜜臀| 国产欧美一区二区精品久导航| 一区二区三区中文免费| 国产一区二区三区黄视频| av网站免费线看精品| 欧美日韩成人激情| 国产日本欧洲亚洲| 免费人成在线不卡| 成人精品视频.| 3d动漫精品啪啪1区2区免费| 亚洲国产精品成人综合色在线婷婷| 成人欧美一区二区三区小说 | 国产传媒欧美日韩成人| 欧美综合在线视频| 久久嫩草精品久久久精品| 亚洲第一久久影院| 99久久免费精品高清特色大片| 欧美一级黄色大片| 一区二区三区精密机械公司| 国产精品白丝jk白祙喷水网站| 在线观看一区日韩| 国产精品久久久久影院亚瑟| 国产一区三区三区| 日韩欧美高清一区| 亚洲国产另类av| 97se亚洲国产综合自在线观| www亚洲一区| 裸体一区二区三区| 欧美人牲a欧美精品| 亚洲高清中文字幕| 欧美少妇性性性| 亚洲特级片在线| jizzjizzjizz欧美| 久久久久99精品一区| 国内不卡的二区三区中文字幕| 国产欧美一区视频| 国模套图日韩精品一区二区| 欧美大片一区二区| 美女视频网站久久| 欧美一区二区视频免费观看| 日韩黄色片在线观看| 91精品黄色片免费大全| 免费久久精品视频| 精品精品欲导航| 精品一二三四在线|