青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

OpenCASCADE 參數(shù)曲面面積

Posted on 2017-12-09 20:55 eryar 閱讀(3425) 評論(2)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE 參數(shù)曲面面積

eryar@163.com

Abstract. 本文介紹了參數(shù)曲面的第一基本公式,并應用曲面的第一基本公式,結合OpenCASCADE中計算多重積分的類,對任意參數(shù)曲面的面積進行計算。

Key Words. Parametric Curve, Parametric Surface, Gauss Integration, Global Properties

1.Introduction

我們知道一元函數(shù)y=f(x)的圖像是一條曲線,二元函數(shù)z=f(x,y)的圖像是一張曲面。但是,把曲線曲面表示成參數(shù)方程則更加便利于研究,這種表示方法首先是由歐洲瑞士數(shù)學家Euler引進的。例如,在空間中的一條曲線可以表示為三個一元函數(shù):

X=x(t), Y=y(t), Z=z(t)

在向量的概念出現(xiàn)后,空間中的一條曲線可以自然地表示為一個一元向量函數(shù):

r=r(t)=(x(t), y(t), z(t))

用向量函數(shù)來表示曲線和曲面后,使曲線曲面一些量的計算方式比較統(tǒng)一。如曲線可以表示為一元向量函數(shù),曲面可以表示為二元向量函數(shù)。

本文結合OpenCASCADE來介紹參數(shù)曲線曲面積分分別計算曲線弧長和曲面的面積。結合《微分幾何》來更好地理解曲線曲面相關知識。

2.Curve Natural Parametric Equations

設曲線C的參數(shù)方程是r=r(t),命:

wps_clip_image-10887

則s是該曲線的一個不變量,即它與空間中的坐標系的選擇無關,也與該曲線的參數(shù)變換無關。前者是因為在笛卡爾直角坐標變換下,切向量的長度|r’(t)|是不變的,故s不變。關于后者可以通過積分的變量的替換來證明,設參數(shù)變換是:

wps_clip_image-21189

并且

wps_clip_image-16009

因此

wps_clip_image-31864

根據(jù)積分的變量替換公式有:

wps_clip_image-29413

不變量s的幾何意義就是曲線段的弧長。這說明曲線參數(shù)t可以是任意的,但選擇不同的參數(shù)得到的參數(shù)方程會有不同,但是曲線段的弧長是不變的。以曲線弧長作為曲線方程的參數(shù),這樣的方程稱為曲線的自然參數(shù)方程Natural Parametric Equations。

由曲線的參數(shù)方程可知,曲線弧長的計算公式為:

wps_clip_image-8988

幾何意義就是在每個微元處的切向量的長度求和。

3.Gauss Integration for Arc Length

曲線弧長的計算就是一元函數(shù)的積分。OpenCASCADE中是如何計算任意曲線弧長的呢?直接找到相關的源碼列舉如下:(在類CPnts_AbscissaPoint中)

// auxiliary functions to compute the length of the derivative
static Standard_Real f3d(const Standard_Real X, const Standard_Address C)
{
  gp_Pnt P;
  gp_Vec V;
((Adaptor3d_Curve*)C)->D1(X,P,V);
return V.Magnitude();
}
static Standard_Real f2d(const Standard_Real X, const Standard_Address C)
{
  gp_Pnt2d P;
  gp_Vec2d V;
((Adaptor2d_Curve2d*)C)->D1(X,P,V);
return V.Magnitude();
}
//==================================================================
//function : Length
//purpose  : 3d with parameters
//==================================================================

Standard_Real CPnts_AbscissaPoint::Length(const Adaptor3d_Curve& C,
const Standard_Real U1,
const Standard_Real U2)
{
  CPnts_MyGaussFunction FG;
//POP pout WNT

  CPnts_RealFunction rf = f3d;
  FG.Init(rf,(Standard_Address)&C);
//  FG.Init(f3d,(Standard_Address)&C);

  math_GaussSingleIntegration TheLength(FG, U1, U2, order(C));
if (!TheLength.IsDone()) {
throw Standard_ConstructionError();
}
return Abs(TheLength.Value());
}
//==================================================================
//function : Length
//purpose  : 2d with parameters
//==================================================================

Standard_Real CPnts_AbscissaPoint::Length(const Adaptor2d_Curve2d& C,
const Standard_Real U1,
const Standard_Real U2)
{
  CPnts_MyGaussFunction FG;
//POP pout WNT

  CPnts_RealFunction rf = f2d;
  FG.Init(rf,(Standard_Address)&C);
//  FG.Init(f2d,(Standard_Address)&C);

  math_GaussSingleIntegration TheLength(FG, U1, U2, order(C));
if (!TheLength.IsDone()) {
throw Standard_ConstructionError();
}
return Abs(TheLength.Value());
}

 

上述代碼的意思是直接對曲線的一階導數(shù)的長度求積分,即是弧長。OpenCASCADE的代碼寫得有點難懂,根據(jù)意思把對三維曲線求弧長的代碼改寫下,更便于理解:

//! Function for curve length evaluation.
class math_LengthFunction : public math_Function
{
public:
    math_LengthFunction(const Handle(Geom_Curve)& theCurve)
: myCurve(theCurve)
{
}
virtual Standard_Boolean Value(const Standard_Real X, Standard_Real& F)
{
        gp_Pnt aP;
        gp_Vec aV;
        myCurve->D1(X, aP, aV);
        F = aV.Magnitude();
return Standard_True;
}
private:
    Handle(Geom_Curve) myCurve;
};

 

4.First Fundamental Form of a Surface

曲面參數(shù)方程是個二元向量函數(shù)。根據(jù)《微分幾何》中曲面的第一基本公式(First Fundamental Form of a Surface)可知,曲面上曲線的表達式為:

r=r(u(t), v(t)) = (x(t), y(t), z(t))

若以s表示曲面上曲線的弧長,則由復合函數(shù)求導公式可得弧長微分公式:

wps_clip_image-11118

在古典微分幾何中,上式稱為曲面的第一基本公式,E、F、G稱為第一基本量。在曲面上,每一點的第一基本量與參數(shù)化無關。

利用曲面第一基本公式可以用于計算曲面的面積。參數(shù)曲面上與u,v參數(shù)空間的元素dudv對應的面積元為:

wps_clip_image-3399

由參數(shù)曲面法向的計算可知,曲面的面積元素即為u,v方向上的偏導數(shù)的乘積的模。

wps_clip_image-26176

其幾何意義可以理解為參數(shù)曲面的面積微元是由u,v方向的偏導數(shù)的向量圍成的一個四邊形的面積,則整個曲面的面積即是對面積元素求積分。由于參數(shù)曲面有兩個參數(shù),所以若要計算曲面的面積,只需要對面積元素計算二重積分即可。

5.Gauss Integration for Area

OpenCASCADE的math包中提供了多重積分的計算類math_GaussMultipleIntegration,由類名可知積分算法采用了Gauss積分算法。下面通過具體代碼來說明OpenCASCADE中計算曲面積分的過程。要計算積分,先要定義被積函數(shù)。因為參數(shù)曲面與參數(shù)曲線不同,參數(shù)曲線只有一個參數(shù),而參數(shù)曲面有兩個參數(shù),所以是一個多元函數(shù)。

//! 2D variable function for surface area evaluation.
class math_AreaFunction : public math_MultipleVarFunction
{
public:
    math_AreaFunction(const Handle(Geom_Surface)& theSurface)
: mySurface(theSurface)
{
}
virtual Standard_Integer NbVariables() const
{
return 2;
}
virtual Standard_Boolean Value(const math_Vector& X, Standard_Real& Y)
{
        gp_Pnt aP;
        gp_Vec aDu;
        gp_Vec aDv;
        mySurface->D1(X(1), X(2), aP, aDu, aDv);
        Y = aDu.Crossed(aDv).Magnitude();
return Standard_True;
}
private:
    Handle(Geom_Surface) mySurface;
};

 

由于參數(shù)曲面是多元函數(shù),所以從類math_MultipleVarFunction派生,并在虛函數(shù)NbVariables()中說明有兩個變量。在虛函數(shù)Value()中計算面積元素的值,即根據(jù)曲面第一基本公式中面積元素的定義,對參數(shù)曲面求一階導數(shù),計算兩個偏導數(shù)向量的叉乘的模。

有了被積函數(shù),只需要在定義域對其計算二重積分,相應代碼如下所示:

void evalArea(const Handle(Geom_Surface)& theSurface, const math_Vector& theLower, const math_Vector& theUpper)
{
    math_IntegerVector aOrder(1, 2, math::GaussPointsMax());
    math_AreaFunction aFunction(theSurface);
    math_GaussMultipleIntegration anIntegral(aFunction, theLower, theUpper, aOrder);
if (anIntegral.IsDone())
{
        anIntegral.Dump(std::cout);
}
}

 

通過theLower和theUpper指定定義域,由于采用了Gauss-Legendre算法計算二重積分,所以需要指定階數(shù),且階數(shù)越高積分結果精度越高,這里使用了OpenCASCADE中最高的階數(shù)。

下面通過對基本曲面的面積計算來驗證結果的正確性,并將計算結果和OpenCASCADE中計算面積的類BRepGProp::SurfaceProperties()結果進行對比。

6.Elementary Surface Area Test

下面通過對OpenCASCADE中幾個初等曲面的面積進行計算,代碼如下所示:

/*
Copyright(C) 2017 Shing Liu(eryar@163.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include <gp_Pnt.hxx>
#include <gp_Vec.hxx>
#include <math.hxx>
#include <math_Function.hxx>
#include <math_MultipleVarFunction.hxx>
#include <math_GaussMultipleIntegration.hxx>
#include <Geom_Plane.hxx>
#include <Geom_ConicalSurface.hxx>
#include <Geom_CylindricalSurface.hxx>
#include <Geom_SphericalSurface.hxx>
#include <Geom_ToroidalSurface.hxx>
#include <Geom_BSplineSurface.hxx>
#include <Geom_RectangularTrimmedSurface.hxx>
#include <GeomConvert.hxx>
#include <GProp_GProps.hxx>
#include <TopoDS_Face.hxx>
#include <BRepGProp.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKGeomAlgo.lib")
#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKTopAlgo.lib")
//! 2D variable function for surface area evaluation.
class math_AreaFunction : public math_MultipleVarFunction
{
public:
    math_AreaFunction(const Handle(Geom_Surface)& theSurface)
        : mySurface(theSurface)
    {
    }
    virtual Standard_Integer NbVariables() const
    {
        return 2;
    }
    virtual Standard_Boolean Value(const math_Vector& X, Standard_Real& Y)
    {
        gp_Pnt aP;
        gp_Vec aDu;
        gp_Vec aDv;
        Standard_Real E = 0.0;
        Standard_Real F = 0.0;
        Standard_Real G = 0.0;
        mySurface->D1(X(1), X(2), aP, aDu, aDv);
        E = aDu.Dot(aDu);
        F = aDu.Dot(aDv);
        G = aDv.Dot(aDv);
        Y = Sqrt(E * G - F * F);
        //Y = aDu.Crossed(aDv).Magnitude();
        return Standard_True;
    }
private:
    Handle(Geom_Surface) mySurface;
};
void evalArea(const Handle(Geom_Surface)& theSurface, const math_Vector& theLower, const math_Vector& theUpper)
{
    math_IntegerVector aOrder(1, 2, math::GaussPointsMax());
    math_AreaFunction aFunction(theSurface);
    math_GaussMultipleIntegration anIntegral(aFunction, theLower, theUpper, aOrder);
    if (anIntegral.IsDone())
    {
        anIntegral.Dump(std::cout);
    }
}
void evalArea(const Handle(Geom_BoundedSurface)& theSurface)
{
    math_IntegerVector aOrder(1, 2, math::GaussPointsMax());
    math_Vector aLower(1, 2, 0.0);
    math_Vector aUpper(1, 2, 0.0);
    theSurface->Bounds(aLower(1), aUpper(1), aLower(2), aUpper(2));
    math_AreaFunction aFunction(theSurface);
    math_GaussMultipleIntegration anIntegral(aFunction, aLower, aUpper, aOrder);
    if (anIntegral.IsDone())
    {
        anIntegral.Dump(std::cout);
    }
}
void testFace(const TopoDS_Shape& theFace)
{
    GProp_GProps aSurfaceProps;
    BRepGProp::SurfaceProperties(theFace, aSurfaceProps);
    std::cout << "Face area: " << aSurfaceProps.Mass() << std::endl;
}
void testPlane()
{
    std::cout << "====== Test Plane Area =====" << std::endl;
    Handle(Geom_Plane) aPlaneSurface = new Geom_Plane(gp::XOY());
    math_Vector aLower(1, 2);
    math_Vector aUpper(1, 2);
    // Parameter U range.
    aLower(1) = 0.0;
    aUpper(1) = 2.0;
    // Parameter V range.
    aLower(2) = 0.0;
    aUpper(2) = 3.0;
    evalArea(aPlaneSurface, aLower, aUpper);
    // Convert to BSpline Surface.
    Handle(Geom_RectangularTrimmedSurface) aTrimmedSurface =
        new Geom_RectangularTrimmedSurface(aPlaneSurface, aLower(1), aUpper(1), aLower(2), aUpper(2));
    Handle(Geom_BSplineSurface) aBSplineSurface = GeomConvert::SurfaceToBSplineSurface(aTrimmedSurface);
    evalArea(aBSplineSurface);
    // Test Face.
    TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aTrimmedSurface, Precision::Confusion()).Face();
    testFace(aFace);
    aFace = BRepBuilderAPI_MakeFace(aBSplineSurface, Precision::Confusion()).Face();
    testFace(aFace);
}
void testCylinder()
{
    std::cout << "====== Test Cylinder Area =====" << std::endl;
    Handle(Geom_CylindricalSurface) aCylindrialSurface = new Geom_CylindricalSurface(gp::XOY(), 1.0);
    math_Vector aLower(1, 2);
    math_Vector aUpper(1, 2);
    aLower(1) = 0.0;
    aUpper(1) = M_PI * 2.0;
    aLower(2) = 0.0;
    aUpper(2) = 3.0;
    evalArea(aCylindrialSurface, aLower, aUpper);
    // Convert to BSpline Surface.
    Handle(Geom_RectangularTrimmedSurface) aTrimmedSurface =
        new Geom_RectangularTrimmedSurface(aCylindrialSurface, aLower(1), aUpper(1), aLower(2), aUpper(2));
    Handle(Geom_BSplineSurface) aBSplineSurface = GeomConvert::SurfaceToBSplineSurface(aTrimmedSurface);
    evalArea(aBSplineSurface);
    // Test Face.
    TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aTrimmedSurface, Precision::Confusion()).Face();
    testFace(aFace);
    aFace = BRepBuilderAPI_MakeFace(aBSplineSurface, Precision::Confusion()).Face();
    testFace(aFace);
}
void testSphere()
{
    std::cout << "====== Test Sphere Area =====" << std::endl;
    Handle(Geom_SphericalSurface) aSphericalSurface = new Geom_SphericalSurface(gp::XOY(), 1.0);
    math_Vector aLower(1, 2);
    math_Vector aUpper(1, 2);
    aSphericalSurface->Bounds(aLower(1), aUpper(1), aLower(2), aUpper(2));
    evalArea(aSphericalSurface, aLower, aUpper);
    // Convert to BSpline Surface.
    Handle(Geom_BSplineSurface) aBSplineSurface = GeomConvert::SurfaceToBSplineSurface(aSphericalSurface);
    evalArea(aBSplineSurface);
    // Test Face.
    TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aSphericalSurface, Precision::Confusion()).Face();
    testFace(aFace);
    aFace = BRepBuilderAPI_MakeFace(aBSplineSurface, Precision::Confusion()).Face();
    testFace(aFace);
}
void test()
{
    testPlane();
    testSphere();
    testCylinder();
}
int main(int argc, char* argv[])
{
    test();
    return 0;
}

 

計算結果如下圖所示:

wps_clip_image-21244

上述代碼計算了曲面的面積,再將曲面轉換成B樣條曲面,再使用算法計算面積。再將曲面和轉換的B樣條曲面生成拓樸面,利用OpenCASCADE中計算曲面面積功能進行對比。使用自定義函數(shù)math_AreaFunction利用多重積分類計算的結果與OpenCASCADE中計算曲面面積的值是一致的。當把曲面轉換成B樣條曲面后,OpenCASCADE計算的曲面面積偏大。

7.Conclusion

在學習《高等數(shù)學》的積分時,其主要的一個應用就是計算弧長、面積和體積等。學習高數(shù)抽象概念時,總會問學了高數(shù)有什么用?就從計算機圖形方面來看,可以利用數(shù)學工具對任意曲線求弧長,對任意曲面計算面積等,更具一般性。

通過自定義被積函數(shù)再利用積分算法來計算任意曲面的面積,將理論與實踐結合起來了。即將曲面的第一基本公式與具體的代碼甚至可以利用OpenCASCADE生成對應的圖形,這樣抽象的理論就直觀了,更便于理解相應的概念。

8.References

1.朱心雄. 自由曲線曲面造型技術. 科學出版社. 2000

2.陳維桓. 微分幾何. 北京大學出版社. 2006

3.同濟大學數(shù)學教研室. 高等數(shù)學. 高等教育出版社. 1996

Feedback

# re: OpenCASCADE 參數(shù)曲面面積  回復  更多評論   

2020-05-14 11:56 by 七星重劍
真專業(yè),佩服

# re: OpenCASCADE 參數(shù)曲面面積  回復  更多評論   

2020-05-15 11:09 by eryar
@七星重劍
這些算法最后都是數(shù)學理論的應用,能理論聯(lián)系實踐挺有收獲的
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品成人欧美大片古装| 女人天堂亚洲aⅴ在线观看| 亚洲欧美日韩人成在线播放| 日韩亚洲精品视频| 亚洲国产另类久久久精品极度| 国产欧美日韩视频一区二区三区| 欧美亚州一区二区三区| 国产精品成人aaaaa网站| 欧美日韩亚洲一区二区三区在线| 欧美国产亚洲精品久久久8v| 欧美人与禽猛交乱配| 欧美日韩午夜视频在线观看| 国产精品美女999| 国产一区二区三区av电影| 国产综合色在线| 在线欧美日韩国产| 99精品国产福利在线观看免费| 99视频一区二区三区| 亚洲欧美日韩电影| 久久久久国产精品一区二区| 亚洲成色精品| 欧美不卡视频一区发布| 欧美激情一区二区三区成人| 欧美激情影院| 日韩一区二区精品视频| 老司机精品福利视频| 欧美福利电影在线观看| 欧美成人免费在线视频| 日韩一级黄色大片| 欧美亚洲自偷自偷| 欧美二区在线播放| 国产精品成人aaaaa网站| 国产亚洲精品综合一区91| 在线观看不卡av| 午夜国产精品视频| 欧美成人免费网站| 亚洲五月六月| 久久综合给合| 国产在线精品一区二区中文| 亚洲精品日韩在线观看| 久久精品国产一区二区三区免费看| 久久久久久精| 一区二区三区成人| 欧美风情在线| 亚洲第一精品夜夜躁人人爽| 欧美在线首页| 亚洲日韩欧美视频一区| 午夜视频在线观看一区| 欧美日韩美女在线观看| 亚洲高清资源综合久久精品| 欧美一区二区私人影院日本| 亚洲欧洲精品一区二区精品久久久 | 99国产精品久久久久久久| 久久国产主播| 国产日韩视频| 亚洲综合欧美| 亚洲欧洲视频在线| 亚洲一区久久久| 欧美日韩在线观看一区二区三区| 欧美日韩在线观看一区二区| 国产免费一区二区三区香蕉精| 一区二区三区四区五区精品| 亚洲第一毛片| 蜜臀91精品一区二区三区| 狠狠色丁香久久综合频道| 欧美在线观看视频一区二区| 亚洲精品一区二区三区av| 欧美国产精品v| 日韩亚洲欧美精品| 亚洲人成人77777线观看| 免费中文字幕日韩欧美| 一色屋精品视频免费看| 免费影视亚洲| 欧美二区不卡| 亚洲一区二区三区四区五区午夜| 亚洲免费观看高清在线观看 | 午夜精品福利电影| 欧美一区二区三区在线观看| 久久视频一区二区| 欧美在线亚洲在线| 狠狠综合久久| 欧美成人午夜影院| 欧美高清视频一区二区| av成人激情| 亚洲午夜免费视频| 国产精品久久久久久久久久免费 | 午夜精品久久久久久久久久久| 国产精品日韩一区二区| 久久国产66| 久久久久久久精| 亚洲美女毛片| 亚洲免费在线视频| 在线成人性视频| 一区二区三区不卡视频在线观看| 国产精品自拍三区| 欧美h视频在线| 欧美三级日本三级少妇99| 销魂美女一区二区三区视频在线| 久久精品99无色码中文字幕| 91久久国产综合久久蜜月精品| 亚洲精选一区| 国内精品伊人久久久久av影院 | 亚洲人成人99网站| 99riav国产精品| 有码中文亚洲精品| 亚洲精品一区二区三| 国产综合久久| 亚洲毛片视频| 永久免费精品影视网站| 99国产精品99久久久久久粉嫩 | 亚洲高清不卡| 国产精品爽爽爽| 亚洲国产成人av好男人在线观看| 欧美午夜久久久| 欧美丰满少妇xxxbbb| 国产精品黄色在线观看| 欧美高清在线精品一区| 国产日韩一区二区| 亚洲精品美女在线| 亚洲电影免费观看高清| 亚洲欧美国产日韩天堂区| 91久久视频| 久久福利精品| 久久综合九色综合网站| 亚洲女性裸体视频| 欧美风情在线| 欧美激情视频在线播放| 激情av一区二区| 亚洲欧美综合v| 欧美成人日本| 精品av久久久久电影| 亚洲六月丁香色婷婷综合久久| 国产亚洲成精品久久| 一区二区三区国产| 一本久道综合久久精品| 久久久亚洲成人| 亚洲性视频网址| 欧美精品www| 91久久精品www人人做人人爽| 黄色成人在线免费| 欧美在线一二三区| 久久精品综合网| 国产欧美在线播放| 亚洲一区久久久| 欧美在现视频| 国产女主播一区二区三区| 宅男精品导航| 亚洲一区免费观看| 国产精品扒开腿爽爽爽视频| aa国产精品| 午夜日韩激情| 国产一级一区二区| 欧美在线亚洲在线| 欧美.com| 日韩一区二区精品| 欧美日韩免费高清一区色橹橹| 99国产一区| 欧美中文日韩| 伊人久久大香线蕉综合热线| 看片网站欧美日韩| 亚洲欧洲日韩女同| 亚洲校园激情| 国产在线日韩| 欧美成人日韩| 影音先锋在线一区| 欧美人与性动交a欧美精品| 在线性视频日韩欧美| 久久精品一区二区国产| 亚洲欧洲在线观看| 国产精品伦理| 久久综合中文字幕| 一区二区三区成人精品| 久久久久久一区二区| 日韩一级精品| 一区一区视频| 国产精品成人播放| 久久婷婷国产麻豆91天堂| 亚洲免费成人av| 麻豆精品视频| 性伦欧美刺激片在线观看| 黑人一区二区| 国产精品二区二区三区| 久久国产精品网站| 亚洲丝袜av一区| 欧美成人一二三| 久久精品女人的天堂av| 在线视频精品一区| 亚洲国产天堂久久综合| 国产欧美一区二区在线观看| 欧美日韩午夜视频在线观看| 久久―日本道色综合久久| 日韩一二三区视频| 另类激情亚洲| 亚洲欧美成人一区二区三区| 亚洲国产日韩欧美在线动漫| 国产欧美日韩激情| 99精品国产福利在线观看免费 | 欧美激情一区二区久久久| 香蕉久久一区二区不卡无毒影院| 亚洲国内高清视频|